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

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

例如,在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个高比特平面所重建的图像,所损失的细节,是我们可以接受的。


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值