OpenCV-Python 视频演示:图像位平面分解与合成的过程
文章目录
一、前言
本次演示使用的这张图片来源于壁纸网站,如有侵权,请联系我删除。
关于位平面分解的原理,这里不进行进行阐述,只展示代码和运行结果。
所用到的库:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
二、位平面分解(提取)与合成
1.灰度图-位平面提取
def bit_decompose_gray(file):
# 灰度图-位平面提取
img = cv.imread(file, 0)
r,c = img.shape
mask = np.zeros((r, c, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 2 ** i
for i in range(8):
temp = cv.bitwise_and(img, mask[:, :, i])
title = '{:0>8s}'.format(str(bin(2 ** i))[2:])
plt.subplot(2, 4, i + 1), plt.title(title)
plt.imshow(temp, 'gray')
plt.xticks([]), plt.xticks([]), plt.axis('off')
plt.show()
如图所示的8个图中,分别提取的是从第0位至第7位的位图。
如标题所示:00000001表示提取第0位,00000010表示提取第1位,以此类推,并且下文也是采用这种规则。
2.彩色图-位平面提取
def bit_decompose_rgb(file):
# 彩色图-位平面提取
img = cv.imread(file, -1)
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
x, y, z = img.shape
mask = np.zeros((x, y, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 2 ** i
temp = np.zeros((x, y, 3), 'uint8')
for i in range(8):
temp[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
temp[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
temp[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])
title = '{:0>8s}'.format(str(bin(2 ** i))[2:])
plt.subplot(2, 4, i + 1), plt.title(title)
plt.imshow(temp)
plt.xticks([]), plt.xticks([]),plt.axis('off')
plt.show()
在低4位(第0位~第3位)提取的画面都非常暗,不容易观察。
可以经过阈值处理,把大于0的像素值都显示为255,这样就能够比较明显地看到变化了:
# 对temp进行阈值处理
m = temp[:,:] > 0
temp[m] = 255
三、视频演示:图像位平面分解与合成的过程
1.灰度图-位平面提取过程
def bit_decompose_gray_video(file):
# 视频演示:灰度图-位平面提取过程
img = cv.imread(file, 0)
r, c = img.shape
mask = np.zeros((r, c, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 255 - 2**i
cv.imshow('11111111', img)
cv.waitKey(1250)
num = 255
# for i in range(8): # 从低位到高位的顺序提取
for i in range(7, -1, -1): # 从高位到低位的顺序提取
img = cv.bitwise_and(img, mask[:, :, i])
num -= 2**i
title = '{:0>8s}'.format(str(bin(num))[2:])
cv.setWindowTitle('11111111', title)
cv.imshow('11111111', img)
cv.waitKey(1250)
cv.waitKey()
cv.destroyAllWindows()
视频演示过程中,请留意标题的变化。
11111111表示未开始提取的原图
01111111表示从原图中提取了第8位位图之后的效果
00111111表示从原图提取了第8、7位位图之后的效果,依次类推。
所以00000000是一张纯黑的图,因为原图的8位的位图都已经被提取了。
其实00000111和00000011和00000001也已经是接近黑的图了,高位的位图已经被提取了,剩下低位的位图所包含原图的元素已经很少了。
上面是从高位到低位的顺序提取,也可以从低位到高位的顺序进行提取,
如代码中for循环的备注所示,只要修改一下for循环的顺序就可以了。
下面演示从低位到高位的顺序进行提取:
也可以发现刚开始从低位提取的时候,对原图的影响是不大的。
2.彩色图-位平面提取过程
def bit_decompose_rgb_video(file):
# 视频演示:彩色图-位平面提取过程
img = cv.imread(file, -1)
x, y, z = img.shape
mask = np.zeros((x, y, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 255 - 2**i
cv.imshow('11111111', img)
cv.waitKey(1250)
num = 255
# for i in range(8): # 从低位到高位的顺序提取
for i in range(7, -1, -1): # 从高位到低位的顺序提取
img[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
img[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
img[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])
num -= 2**i
title = '{:0>8s}'.format(str(bin(num))[2:])
cv.setWindowTitle('11111111',title)
cv.imshow('11111111',img)
cv.waitKey(1250)
cv.waitKey()
cv.destroyAllWindows()
从高位到低位的顺序提取
从低位到高位的顺序提取
上面演示的是分解过程,接下来演示合成过程 (要想进行合成,也是要先对原图进行分解,分解之后再进行合成)
3.灰度图-位平面合成过程
def bit_compose_gray_video(file):
# 视频演示:灰度图-位平面合成过程
img = cv.imread(file, 0)
r, c = img.shape
mask = np.zeros((r, c, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 2 ** i
cv.imshow('00000000', img)
cv.waitKey(1250)
num = 0
temp = np.zeros((r, c), 'uint8')
# for i in range(8): # 从低位到高位的顺序合成
for i in range(7, -1, -1): # 从高位到低位的顺序合成
bit_img = cv.bitwise_and(img, mask[:, :, i])
temp = cv.bitwise_or(temp, bit_img)
num += 2**i
title = '{:0>8s}'.format(str(bin(num))[2:])
cv.setWindowTitle('00000000', title)
cv.imshow('00000000', temp)
cv.waitKey(1250)
cv.waitKey()
cv.destroyAllWindows()
从高位到低位的顺序合成
从低位到高位的顺序合成
4.彩色图-位平面合成过程
def bit_compose_rgb_video(file):
# 视频演示:彩色图-位平面合成过程
img = cv.imread(file, -1)
x, y, z = img.shape
mask = np.zeros((x, y, 8), 'uint8')
for i in range(8):
mask[:, :, i] = 2 ** i
bit_img = np.zeros((x, y, 3), 'uint8')
temp = np.zeros((x, y, 3), 'uint8')
cv.imshow('00000000', temp)
cv.waitKey(1250)
num = 0
# for i in range(8): # 从低位到高位的顺序合成
for i in range(7,-1,-1): # 从高位到低位的顺序合成
bit_img[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
bit_img[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
bit_img[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])
temp[:, :, 0] = cv.bitwise_or(temp[:, :, 0], bit_img[:, :, 0])
temp[:, :, 1] = cv.bitwise_or(temp[:, :, 1], bit_img[:, :, 1])
temp[:, :, 2] = cv.bitwise_or(temp[:, :, 2], bit_img[:, :, 2])
num += 2**i
title = '{:0>8s}'.format(str(bin(num))[2:])
cv.setWindowTitle('00000000', title)
cv.imshow('00000000', temp)
cv.waitKey(1250)
cv.waitKey(0)
cv.destroyAllWindows()
从高位到低位的顺序合成
从低位到高位的顺序合成
转载请附上本文链接:https://blog.csdn.net/FujLiny/article/details/110817053
本文地址:https://blog.csdn.net/FujLiny/article/details/110817053
上一篇: 饱受老婆摧残的苦B老公
下一篇: Parrot机器人来袭 八月份登陆中国