558 字
3 分钟
OpenCV:位平面分解

1. 定义#

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

2. 8位图的位平面分解#

​ 在8位灰度图中,每一个像素都是使用8位二进制值来表示的,值的范围在[0,255]之间。可以将其中的值表示为:value=i=07ai×2i value = \sum_{i=0}^{7} a_i \times 2^i,其中 ai 的可能值为 0 或者 1 。可以看出,各个𝑎𝑖的权重是不一样的, 𝑎7的权重最高, 𝑎0的权重最低,这代表着𝑎7的值对图像的影响最大, 而𝑎0的值对图像的影响最小

​ 通过提取灰度图像像素点二进制像素值的每一比特位的组合,可以得到多个位平面图像。图像中全部像素值的𝑎𝑖值所构成的位平面,称为第i个位平面。在8位灰度图中,可以组成8个二进制值图像,即可以将原图分解为8个位平面。

​ 通过计算得到的位平面是一个二值图像,如果直接将上述得到的位平面显示出来,则会得到一张近似黑色的图像,这是因为默认当前显示的图像是8位灰度图,而当其中的像素值较小时,显示的图像就会是近似黑色的。要想让其显示为白色,必须将所有大于零的数据都处理为255。

2.1 演示#

图像数据#

10进制表示2进制表示
示例图像-10进制示例图像-2进制

图像数据的位平面分解#

示例数据-位平面分解

2.2 示例#

import cv2
import numpy as np
img = cv2.imread("person.jpg", 0)
cv2.imwrite("person-gray.jpg", img)
h, w = img.shape
x = np.zeros((h, w, 8), dtype=np.uint8)
for i in range(8):
x[:,:,i] = 2**i
r = np.zeros((h, w, 8), dtype=np.uint8)
for i in range(8):
r[:,:,i] = cv2.bitwise_and(img, x[:,:,i])
mask = r[:,:,i]>0
r[mask]=255
cv2.imwrite(str(i) + ".jpg", r[:,:,i])

原始图像#

彩色图像灰度图像
personperson-gray

位平面分解的图像#

第0层第1层第2层第3层
第4层第5层第6层第7层
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00