【图像处理笔记】比特平面分层

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

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

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


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

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

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

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

【图像处理笔记】比特平面分层_第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的图像

【图像处理笔记】比特平面分层_第3张图片  【图像处理笔记】比特平面分层_第4张图片  【图像处理笔记】比特平面分层_第5张图片  【图像处理笔记】比特平面分层_第6张图片

【图像处理笔记】比特平面分层_第7张图片 【图像处理笔记】比特平面分层_第8张图片 【图像处理笔记】比特平面分层_第9张图片 【图像处理笔记】比特平面分层_第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和原图像

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

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

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


你可能感兴趣的:(图像处理相关,【图像处理笔记】)