【Python——opencv篇】 bitwise_and、bitwise_not等图像基本运算及掩膜

1.图像基本运算

图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。总之,对于图像可以进行的基本运算非常的多,只是挑了些常用的操作详解。

void add(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 + src2
void subtract(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), int dtype=-1);//dst = src1 - src2
void multiply(InputArray src1, InputArray src2,OutputArray dst, double scale=1, int dtype=-1);//dst = scale*src1*src2
void divide(InputArray src1, InputArray src2, OutputArray dst,double scale=1, int dtype=-1);//dst = scale*src1/src2
void divide(double scale, InputArray src2,OutputArray dst, int dtype=-1);//dst = scale/src2
void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);//dst = alpha*src1 + src2
void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype=-1);//dst = alpha*src1 + beta*src2 + gamma
void sqrt(InputArray src, OutputArray dst);//计算每个矩阵元素的平方根
void pow(InputArray src, double power, OutputArray dst);//src的power次幂
void exp(InputArray src, OutputArray dst);//dst = e**src(**表示指数的意思)
void log(InputArray src, OutputArray dst);//dst = log(abs(src))

上述的基本操作中都属于将基础数学运算应用于图像像素的处理中,下面将着重介绍

bitwise_and、bitwise_or、bitwise_xor、bitwise_not这四个按位操作函数。

void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 ^ src2
void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray());//dst = ~src


bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1

2.掩膜(mask)

2.1在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:

数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。 
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。 
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。 
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。 
④特殊形状图像的制作。

2.2 在所有图像基本运算的操作函数中,凡是带有掩膜(mask)的处理函数,其掩膜都参与运算(输入图像运算完之后再与掩膜图像或矩阵运算)。

3.掩膜应用实例

以郁金香图片为例,原图大小为1024×768,先压缩一下,利用opencv的inRange()函数,制作掩模,再用bitwise_and()函数,提取感兴趣区域:

3.1代码

import cv2 as cv
import numpy as np

# set blue thresh
lower_yellow=np.array([11,43,46])
upper_yellow=np.array([25,255,255])

frame=cv.imread("tulips.jpg") #读取图像
cv.imshow("who",frame)

#compress
cp = cv.resize(frame, (300,300), interpolation=cv.INTER_AREA)
cv.imwrite("tulips_1.jpg",cp)

# change to hsv model
hsv = cv.cvtColor(cp, cv.COLOR_BGR2HSV)
 
# get mask
mask = cv.inRange(hsv, lower_yellow, upper_yellow)
cv.imshow('Mask', mask)

# detect blue
res = cv.bitwise_and(cp, cp, mask=mask)
cv.imshow('Result', res)
 
cv.waitKey(0)
cv.destroyAllWindows()

3.2实验效果 

              压缩(300×300)                                                              掩模(300×300)

                       
                              

                                                        处理后(300×300)

                                          

利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除,其余按位操作原理类似只是效果不同而已。

参考博文:https://blog.csdn.net/u011028345/article/details/77278467 
 

  • 15
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
cv2.bitwise_and函数是OpenCV的一个位与操作函数,用于对两个图像进行逐像素的位与运算。位与运算是一种逻辑运算,它对两个二进制数的对应位进行逻辑与操作,如果两个二进制数的对应位都为1,则结果对应位也为1;否则,结果对应位为0。 在OpenCV,使用cv2.bitwise_and函数可以实现图像掩膜操作。具体来说,可以通过将一个二值图像作为掩膜图像,将其与原始图像进行位与操作,从而只保留原始图像掩膜图像对应像素值为1的部分,其他部分置为0。 你提到的"最大"可能是指掩膜图像像素值的最大值。如果需要将掩膜图像值为最大的像素作为掩膜进行位与操作,可以通过构造一个与原始图像尺寸相同、所有元素值均为最大值的图像作为掩膜,然后将其与原始图像进行位与运算。 以下是一个示例代码: ```python import cv2 import numpy as np # 读取原始图像 img = cv2.imread('image.jpg') # 构造掩膜图像,所有元素值均为255(即最大值) mask = np.ones_like(img) * 255 # 进行位与操作 result = cv2.bitwise_and(img, mask) # 显示结果 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码,我们读取了一张名为'image.jpg'的原始图像,然后构造了一个与原始图像尺寸相同的掩膜图像,所有元素值均为255。最后,通过cv2.bitwise_and函数将原始图像掩膜图像进行位与操作,得到结果图像并显示出来。 希望以上解答能够帮到你!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lily_9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值