前情提要
在第5节课《OpenCV-Python快速入门系列05图像像素的算术操作》提到了像素算术操作的基本类型有加法操作、减法操作、乘法操作、除法操作、按位操作、其他非线性操作(如幂运算、对数运算等)。但并没详细的对按位操作进行讲解,本节课的逻辑操作实际上就是指按位操作。
代码
def bitwise_demo():
b1=np.zeros((400,400,3),dtype=np.uint8)
b1[:,:] = (255,0,255)
b2 = b1.copy()
b2[:,:]=(0,255,0)
cv.imshow("b1",b1)
cv.imshow("b2",b2)
dst_and= cv.bitwise_and(b1,b2)
cv.imshow("dst_and",dst_and)
dst_or = cv.bitwise_or(b1,b2)
cv.imshow("dst_or",dst_or)
dst_not = cv.bitwise_not(b1)
cv.imshow("dst_not", dst_not)
cv.waitKey(0)
效果图
代码解析
1. 定义图像并初始化颜色
b1 = np.zeros((400, 400, 3), dtype=np.uint8)
b1[:, :] = (255, 0, 255) # 初始化 b1,颜色为紫色 (BGR: 255, 0, 255)
b2 = b1.copy() # 复制 b1
b2[:, :] = (0, 255, 0) # 将 b2 的颜色改为绿色 (BGR: 0, 255, 0)
b1
和b2
:b1
是一个 400×400 的三通道彩色图像,颜色初始化为紫色(BGR)。b2
是b1
的副本,颜色被改为绿色。
2. 按位与(AND)
dst_and = cv.bitwise_and(b1, b2)
cv.imshow("dst_and", dst_and)
- 逻辑:
cv.bitwise_and
对两个图像的每个像素逐位执行按位与操作。- 紫色
(255, 0, 255)
和绿色(0, 255, 0)
按位与的结果是黑色(0, 0, 0)
,因为没有通道的值同时为非零。
3. 按位或(OR)
dst_or = cv.bitwise_or(b1, b2)
cv.imshow("dst_or", dst_or)
- 逻辑:
cv.bitwise_or
对两个图像的每个像素逐位执行按位或操作。- 紫色
(255, 0, 255)
和绿色(0, 255, 0)
按位或的结果是白色(255, 255, 255)
,因为每个通道至少有一个非零值。
4. 按位非(NOT)
dst_not = cv.bitwise_not(b1)
cv.imshow("dst_not", dst_not)
- 逻辑:
cv.bitwise_not
是单目操作,它对b1
的每个像素逐位取反。- 紫色
(255, 0, 255)
的按位非结果是黄色(0, 255, 0)
,因为每个通道的值都会被反转。
优化版本
上面的例子能够从数值和颜色变化上看到结果,还能够通过绘制不同的形状来达到目的。
def bitwise_demo():
# 创建两张简单的形状图像
b1 = np.zeros((400, 400), dtype=np.uint8)
b2 = np.zeros((400, 400), dtype=np.uint8)
cv.rectangle(b1, (100, 100), (300, 300), 255, -1) # 在 b1 上绘制白色矩形
cv.circle(b2, (200, 200), 100, 255, -1) # 在 b2 上绘制白色圆形
# 显示原始图像
cv.imshow("b1 (Rectangle)", b1)
cv.imshow("b2 (Circle)", b2)
# 按位与(AND)
dst_and = cv.bitwise_and(b1, b2)
cv.imshow("dst_and (AND)", dst_and)
# 按位或(OR)
dst_or = cv.bitwise_or(b1, b2)
cv.imshow("dst_or (OR)", dst_or)
# 按位非(NOT)
dst_not_b1 = cv.bitwise_not(b1)
cv.imshow("dst_not (NOT b1)", dst_not_b1)
# 按位非(NOT)
dst_not_b2 = cv.bitwise_not(b2)
cv.imshow("dst_not (NOT b2)", dst_not_b2)
# 按位异或(XOR)
dst_xor = cv.bitwise_xor(b1, b2)
cv.imshow("dst_xor (XOR)", dst_xor)
cv.waitKey(0)
cv.destroyAllWindows()
优化后的效果
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容