Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm
将灰度图像中处于同一比特位上的二进制像素值进行组合,得到一幅二进制值图像,该图像被称为灰度图像的一个位平面,这个过程被称为位平面分解。例如,将一幅灰度图像内所有像素点上处于二进制位内最低位上的值进行组合,可以构成“最低有效位”位平面。
在8位灰度图中,每一个像素使用8位二进制值来表示,其值的范围在[0,255]之间。可以将其中的值表示为:
式中,ai的可能值为0或1。可以看出,各个ai的权重是不一样的,a7的权重最高,a0的权重最低。这代表a7的值对图像的影响最大,而a0的值对图像的影响最小。
通过提取灰度图像像素点二进制像素值的每一比特位的组合,可以得到多个位平面图像。图像中全部像素值的ai值所构成的位平面,称为第i个位平面(第i层)。在8位灰度图中,可以组成8个二进制值图像,即可以将原图分解为8个位平面。
根据上述分析,像素值中各个ai的权重是不一样的:
● a7的权重最高,所构成的位平面与原图像相关性最高,该位平面看起来通常与原图像最类似。
● a0权重最低,所构成的位平面与原图像相关性最低,该平面看起来通常是杂乱无章的。
eg:编写程序,观察灰度图像的各个位平面。
代码如下:
#图层提取
import cv2
import numpy as np
lena=cv2.imread("lena.bmp",0)
cv2.imshow("lena",lena)
r,c=lena.shape
x=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
x[:,:,i]=2**i
r=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
r[:,:,i]=cv2.bitwise_and(lena,x[:,:,i])
mask=r[:,:,i]>0
r[mask]=255
cv2.imshow(str(i),r[:,:,i])
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,通过两个循环提取了灰度图像的各个位平面,具体说明如下。
● 使用x=np.zeros((r, c,8), dtype=np.uint8)语句设置一个用于提取各个位平面的提取矩阵。该矩阵是“r×c×8”大小的,其中r是行高,c是列宽,8表示共有8个通道。r、c的值来源于要提取的图像的行高、列宽。矩阵x的8个通道分别用来提取灰度图像的8个位平面。例如,x[:, :,0]用来提取灰度图像的第0个位平面。
● 在第1个for循环中,使用x[:, :, i]=2**i语句设置用于提取各个位平面的提取矩阵的值。
● 在第2个for循环中,实现了各个位平面的提取、阈值处理和显示。
运行上述程序,得到如下图所示的图像,其中:
● 图(a)是原始lena图像。
● 图(b)是第0个位平面,第0个位平面位于8位二进制值的最低位,其权重最低,对像素值的影响最小,与lena图像的相关度也最低,所以显示出来的是一幅杂乱无章的图像。
● 图©是第1个位平面。
● 图(d)是第2个位平面。
● 图(e)是第3个位平面。
● 图(f)是第4个位平面。
● 图(g)是第5个位平面。
● 图(h)是第6个位平面。
● 图(i)是第7个位平面,第7个位平面位于8位二进制值的最高位,其对像素值的影响最大。第7位二进制值在8位二进制数中权重最高,与lena图像的相关度最高。所以,第7个位平面是与原始图像最接近的二值图像。