飞道的博客

OpenCV-Python图像位与运算bitwise_and函数详解

587人阅读  评论(0)

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython

一、概述

图像的与运算主要用于获取某个图像中感兴趣的部分,是针对两个图像矩阵数组或一个数组与标量的按位与,其结果计算方法如下:

  1. 当src1和src2代表的两个图像矩阵数组的大小相同时,结果矩阵元素的值为:
    dst(I)=src1(I)∧src2(I) if mask(I)≠0
  2. 当src1为矩阵数组而src2为标量时,结果矩阵元素的值为:
    dst(I)=src1(I)∧src2 if mask(I)≠0
    具体标量经老猿测试发现可以是一个常数或一个代表BGRA的四元组,是否还有其他形式不确认,但二元组和三元组肯定不行,如果是常数,OpenCV会转成一个代表BGRA的4元组参与运算,该四元组的第一个元素就是该常数,其他元素为0。
  3. src1为标量而src2为矩阵数组时,结果矩阵元素的值为:
    dst(I)=src1∧src2(I) if mask(I)≠0
    标量取值与上面场景相同。

关于上述运算过程,补充说明如下:

  1. 在浮点数组的情况下,位运算与机器环境相关的位表示方法(通常与IEEE754兼容)相关;
  2. 在多通道矩阵数组情况下,每个通道都是独立处理的;
  3. 在上述第二和第三种情况下,标量如果为常数或单一数值变量,首先转换为四元组。

二、语法说明

函数原型:

bitwise_and(src1, src2, dst=None, mask=None)

参数说明:
  • src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组
  • dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同
  • mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0

返回值为结果图像矩阵,如果dst传入了实参,则返回值与dst对应 实参相同。

三、案例:

下面的案例将一副图像加载到内存,然后分别与一个数值和一个构造的mask矩阵相乘。加载的原图imgs.jpg大小为720*600的三通道彩色图像。图像如下:

案例代码如下:

import numpy as np
import cv2
def main():
    imgSrc = cv2.imread(r'F:\pic\imgs.JPG')
    # 下面2行代码构造输出OpenCV图标的掩膜,255确保所有位都是1
    imgMask = np.zeros(imgSrc.shape,dtype=np.uint8)
    imgMask[20:190,580:715] = 255 
  

    resultImg1 = cv2.bitwise_and(imgSrc, imgMask)
    resultImg2 = cv2.bitwise_and(imgSrc, 255)
    resultImg3 = cv2.bitwise_and(imgSrc, (255,255,255,255))

    cv2.imshow('resultImg1', resultImg1)
    cv2.imshow('resultImg2', resultImg2)
    cv2.imshow('resultImg3', resultImg3)
    cv2.waitKey(0)
 
main()

输出三幅图像分别如下:



可以看到数值255与图像数组与时只保留了B通道的像素值,图像全部蓝化。

四、小结

本文详细介绍了OpenCV-Python图像位与运算bitwise_and函数的语法及计算方法,并举例说明了图像和标量的按位与、构造的掩膜图像和图像的按位与。可以看到bitwise_and可以控制选择感兴趣的通道(调整四元组的元素值)或区域进行输出。同时bitwise_and可以用于对图像上某些区域作屏蔽,使其不参加处理,也可以进行图像结构特征提取,用相似性变量或图像匹配方法检测和提取图像中相似的结构特征。

如果觉得本文可以给您带来帮助,请大家帮忙点个赞、加个收藏,谢谢!

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理》相关文章。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录


转载:https://blog.csdn.net/LaoYuanPython/article/details/109148867
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场