比特平面重建图像matlab,【图像处理笔记】比特平面分层

像素是由比特组成的数字。

例如,在256级的灰度图中,每个像素是由8比特(也就是1个字节)组成的。

代替突出灰度级范围,我们可以突出特定比特来为整个图像的外观做出贡献。

一幅8比特图像,可以认为是8个1比特的平面组成,其中平面1包含图像中所有像素的最低阶比特,而平面8包含图像中所有像素的最高阶比特。

2247525f36134d1ce5961d9ffe5903e2.png

显示一幅8比特图像的第8个比特平面并不困难,可对它进行二值化,0-127之间映射为0,128-255之间映射为1。

以下是vb.net实现的比特平面分层:

0125de4ecb119a698e7b29e39aa66d0d.png

代码写的很丑陋/(ㄒoㄒ)/~~,见谅哈

'将一幅灰度图分为8个1比特的平面

Dim img As New Image(Of Gray, Byte)("C:\test3.bmp")

Dim height As Integer = img.Height

Dim width As Integer = img.Width

'初始化8个1比特的平面

Dim img1 As New Image(Of Gray, Byte)(width, height)

Dim img2 As New Image(Of Gray, Byte)(width, height)

Dim img3 As New Image(Of Gray, Byte)(width, height)

Dim img4 As New Image(Of Gray, Byte)(width, height)

Dim img5 As New Image(Of Gray, Byte)(width, height)

Dim img6 As New Image(Of Gray, Byte)(width, height)

Dim img7 As New Image(Of Gray, Byte)(width, height)

Dim img8 As New Image(Of Gray, Byte)(width, height)

For i = 0 To height - 1

For j = 0 To width - 1

'将像素值转化为二进制

Dim binaryImgData As String = Val(Convert.ToString(img.Data(i, j, 0), 2)).ToString("00000000")

img1.Data(i, j, 0) = Val(binaryImgData(7))

If Val(binaryImgData(6)) = 0 Then

img2.Data(i, j, 0) = 0

Else

img2.Data(i, j, 0) = 255

End If

If Val(binaryImgData(5)) = 0 Then

img3.Data(i, j, 0) = 0

Else

img3.Data(i, j, 0) = 255

End If

If Val(binaryImgData(4)) = 0 Then

img4.Data(i, j, 0) = 0

Else

img4.Data(i, j, 0) = 255

End If

If Val(binaryImgData(3)) = 0 Then

img5.Data(i, j, 0) = 0

Else

img5.Data(i, j, 0) = 255

End If

If Val(binaryImgData(2)) = 0 Then

img6.Data(i, j, 0) = 0

Else

img6.Data(i, j, 0) = 255

End If

If Val(binaryImgData(1)) = 0 Then

img7.Data(i, j, 0) = 0

Else

img7.Data(i, j, 0) = 255

End If

If Val(binaryImgData(0)) = 0 Then

img8.Data(i, j, 0) = 0

Else

img8.Data(i, j, 0) = 255

End If

Next

Next

img1.Save("C:\比特平面分层\img1.bmp")

img2.Save("C:\比特平面分层\img2.bmp")

img3.Save("C:\比特平面分层\img3.bmp")

img4.Save("C:\比特平面分层\img4.bmp")

img5.Save("C:\比特平面分层\img5.bmp")

img6.Save("C:\比特平面分层\img6.bmp")

img7.Save("C:\比特平面分层\img7.bmp")

img8.Save("C:\比特平面分层\img8.bmp")

以下是生成的比特平面1到8的图像

f5d9509b116f80b4a8541b705e5d4c73.png 

725efc049fb2574c13952e744fcbe7b8.png 

8f653ee8212a91a89767bf77a0799f4d.png 

088089fdfe83563e5fa39981a235da2b.png

92c88d8171777629498fbe247dbd9a67.png 4fe6727db969a94bbc585a7c51a253a9.png 2d01d7973cec9288c3d32d3b2dbcbf09.png 969d3b0d92c59a4debc31ae2b29f392c.png

这8个1比特平面的显示很怪异。上面都是一个个光圈。。。感觉应该是跟光照有关吧。

把一幅图像分解为比特平面,对于分析图像中的每个比特的相对重要性是很有用的,可以帮助我们确定用于量化该图像的比特数的充分性。

此外,这种类型的分解对于图像压缩也很有作用。在图像压缩中,重建一幅图像时,所用的平面要比全部平面少。

以下是用vb.net实现的比特平面重建:

For i = 0 To height - 1

For j = 0 To width - 1

'将像素值转化为二进制

Dim binaryImgData As String = Val(Convert.ToString(img.Data(i, j, 0), 2)).ToString("00000000")

img87reconstructed.Data(i, j, 0) = Val(binaryImgData(0)) * 2 ^ 7 + Val(binaryImgData(1)) * 2 ^ 6

img876reconstructed.Data(i, j, 0) = Val(binaryImgData(0)) * 2 ^ 7 + Val(binaryImgData(1)) * 2 ^ 6 + Val(binaryImgData(2)) * 2 ^ 5

img8765reconstructed.Data(i, j, 0) = Val(binaryImgData(0)) * 2 ^ 7 + Val(binaryImgData(1)) * 2 ^ 6 + Val(binaryImgData(2)) * 2 ^ 5 + Val(binaryImgData(3)) * 2 ^ 4

Next

Next

img87reconstructed.Save("C:\比特平面分层\87重构.bmp")

img876reconstructed.Save("C:\比特平面分层\876重构.bmp")

img8765reconstructed.Save("C:\比特平面分层\8765重构.bmp")以下分别是用第8第7比特平面累加重构的图像、876、8765和原图像

9d840bf07e8ade07a4199388666d6b61.png cc9b19dd464e05d08a9f5c07434379d9.png 910d3da9bc61f08063fdb0f0e75b35af.png 1815d73a9ed946145539ff98b7f992b1.png

在重构中,使用更多的平面对图像的外观不会有更大的贡献。

我们可以得出这样得结论:存储4个高比特平面所重建的图像,所损失的细节,是我们可以接受的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值