OpenCV-Python快速入门系列10图像像素的逻辑操作

前情提要

在第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]-OpenCV-Python快速入门系列10图像像素的逻辑操作-天煜博客

代码解析

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)
  • b1b2
    • b1 是一个 400×400 的三通道彩色图像,颜色初始化为紫色(BGR)。
    • b2b1 的副本,颜色被改为绿色。

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()

优化后的效果

图片[2]-OpenCV-Python快速入门系列10图像像素的逻辑操作-天煜博客
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容