像素是由比特组成的数字。
例如,在256级的灰度图中,每个像素是由8比特(也就是1个字节)组成的。
代替突出灰度级范围,我们可以突出特定比特来为整个图像的外观做出贡献。
一幅8比特图像,可以认为是8个1比特的平面组成,其中平面1包含图像中所有像素的最低阶比特,而平面8包含图像中所有像素的最高阶比特。
显示一幅8比特图像的第8个比特平面并不困难,可对它进行二值化,0-127之间映射为0,128-255之间映射为1。
以下是vb.net实现的比特平面分层:
代码写的很丑陋/(ㄒ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的图像
这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和原图像
在重构中,使用更多的平面对图像的外观不会有更大的贡献。
我们可以得出这样得结论:存储4个高比特平面所重建的图像,所损失的细节,是我们可以接受的。