将灰度图像中处于同一比特位上的二进制像素进行组合,得到一幅二进制值图像,该图像称为灰度图像的一个位平面,这个过程称之为位分解。

位平面分解理论

在8位灰度图中,每一个像素使用8位二进制来表示,其值范围在[0,255]之间。可以表示为:
$$
\begin{eqnarray}
value & = & a_{7} \times 2^{7} + a_{6} \times 2^{6}+a_{5} \times 2^{5}+a_{4} \times 2^{4}+a_{3} \times 2^{3}+a_{2} \times 2^{2}+a_{1} \times 2^{1}+a_{0} \times 2^{0}
\end{eqnarray}
$$
式中a_i可以是0,也可以是1。

图像中a_i值所构成的位平面,称为第i个位平面(第i层),在8位灰度图中,可以组成8个二进制值图像。

下图就是以第0位和第7位为例:

位平面分解

针对RGB图像,如果将R通道、G通道、B通道的每一个通道对应的位平面进行合并,即可组成新的RGB彩色图像。

例如,将一幅RGB图像的R通道的第三个位平面、G通道的第三个位平面、B通道的第三个位平面合并,则可以构成一个新的RGB通道,称之为原始图像的第三个位平面。

位平面分解具体步骤

以灰度图为例,介绍位平面分解的具体步骤。

1.图像预处理

读取原始图像O,获取原始图像O的宽度M和高度N。

2.构造提取矩阵

使用按位与操作,能够很方便地将一个数值指定位上的数字提取出来。

提取因子F哪位上的值为1,就可以提取数值N上的哪位数字。

提取

建立一个值均为2^n的矩阵作为提取矩阵,与原始图像进行“与”计算,即可提取第n个位平面。
Mat可能的值

3.提取位平面

像素转换为二进制

加入现在要提取第三位平面,则建立第2^3的数组:

提取第三位平面

4.阈值处理

阈值处理就是让二位值平面里的大于0的值处理为255.

例如在上一步中得到了一堆0和8,8在颜色中显示的是比较淡的,将其赋值为255,就能黑白清晰了。

具体的阈值处理方法为:

mask = RD[:,:,i]>0
RD[mask] = 255
  • 将位平面中大于0的值处理为真(True)
  • 将位平面中小于或等于0的处理为假(Falese)

阈值处理

阈值处理后,则是
阈值处理结果

5. 显示图像

例:读取一幅灰度图,观察各个位平面。

import cv2
import numpy as np
hongmao = cv2.imread('hongmao.jpg', 0)
cv2.imshow('hui', hongmao)  # 显示灰度图
r, c = hongmao.shape
x = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
    x[:, :, i] = 2**i  # 创建8个提取矩阵
y = np.zeros((r, c, 8), dtype=np.uint8) #创建八个0数组
for i in range(8):
    y[:, :, i] = cv2.bitwise_and(hongmao, x[:, :, i])
    mask = y[:, :, i] > 0    #阈值处理
    y[mask] = 255
    cv2.imshow(str(i), y[:, :, i])
cv2.waitKey()

处理结果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/OpenCV9.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏