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

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

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

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

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

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第1张图片

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

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

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第2张图片

代码写的很丑陋/(ㄒ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的图像

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第3张图片 

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第4张图片 

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第5张图片 

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第6张图片

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第7张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第8张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第9张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第10张图片

这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和原图像

比特平面重建图像matlab,【图像处理笔记】比特平面分层_第11张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第12张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第13张图片 比特平面重建图像matlab,【图像处理笔记】比特平面分层_第14张图片

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

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

你可能感兴趣的:(比特平面重建图像matlab)