需要源码请点赞关注收藏后评论区留言私信~~~
图像是由像素组成的,像素又是由具体的正整数表示的,因此图像也可以进行一系列数学运算,通过运算可以获得截取、合并图像等效果。OpenCV提供了很多图像运算方法,经过运算的图像可以呈现出很多有趣的视觉效果
一、掩模
仅仅暴露原始图像中的感兴趣区域(ROI)的模板图像就被叫做掩模
掩模也叫做掩码,英文为mask,在程序中用二值图像来表示,0值区域标识被遮盖的部分,255值区域表示被暴露的部分
外科手术给患者使用的手术洞巾
例如原始图像如下
掩模后图像如下
在使用OpenCV处理图像时,通常使用numpy提供的方法创建掩模图像
下面创建三通道的掩模图像实战
利用numpy的zeros方法创建一幅掩模图像,感兴趣区域为在该图像中横坐标为20 纵坐标为50 宽为60 高为50的矩形,展示该掩模图像,调换该掩模图像的感兴趣区域和不感兴趣区域之后,再次展示该掩模图像
代码如下
import cv2 import numpy as np # 创建宽150、高150、3通道,像素类型为无符号8位数字的零值图像 mask = np.zeros((150, 150, 3), np.uint8) mask[50:100, 20:80, :] = 255; # 50~100行、20~80列的像素改为纯白像素 cv2.imshow("mask1", mask) # 展示掩模 mask[:, :, :] = 255; # 全部改为纯白像素 mask[50:100, 20:80, :] = 0; # 50~100行、20~80列的像素改为纯黑像素 cv2.imshow("mask2", mask) # 展示掩模 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
二、图像的加法运算
图像的每一个像素都用整数表示的像素值,2幅图像相加就是相同位置像素值相加,最后将计算结果按照原位置重新组成一幅新图像 如下图所示
可以使用+方法,但是通常使用opencv提供的add方法 语法格式如下
dst=cv2.add(src1,src2,mask,dtype)
mask为掩模
dtype为图像深度
上述两个参数建议使用默认值
下面分别用+和add方法计算图像和
可见还是有明显的区别
import cv2 img = cv2.imread("beach.jpg") # 读取原始图像 sum1 = img + img # 使用运算符相加 sum2 = cv2.add(img, img) # 使用方法相加 cv2.imshow("img", img) # 展示原图 cv2.imshow("sum1", sum1) # 展示运算符相加结果 cv2.imshow("sum2", sum2) # 展示方法相加结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
下面通过一个实例演示如何使用加运算修改图像颜色
模拟三色光叠加得到白光,现在分别创建纯蓝 纯绿和纯红三种图像 取三幅图像的相加和 查看结果
可见结果为白色,蓝色加上绿色等于青色,青色再加上红色就等于白色,结果符合光学三原色的叠加原理
import cv2 import numpy as np img1 = np.zeros((150, 150, 3), np.uint8) # 创建150*150的0值图像 img1[:, :, 0] = 255 # 蓝色通道賦予最大值 img2 = np.zeros((150, 150, 3), np.uint8) img2[:, :, 1] = 255 # 绿色通道賦予最大值 img3 = np.zeros((150, 150, 3), np.uint8) img3[:, :, 2] = 255 # 红色通道賦予最大值 cv2.imshow("1", img1) # 展示蓝色图像 cv2.imshow("2", img2) # 展示绿色图像 cv2.imshow("3", img3) # 展示红色图像 img = cv2.add(img1, img2) # 蓝色 + 绿色 = 青色 cv2.imshow("1+2", img) # 展示蓝色加绿色的结果 img = cv2.add(img, img3) # 红色 + 青色 = 白色 cv2.imshow("1+2+3", img) # 展示三色图像相加的结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
图像的加法运算中也可以运用掩模,下面通过一个实例介绍掩模的使用方法
创建纯蓝和纯红两幅图像,使用add方法对两幅图像进行加法运算,并在方法中添加一个掩模
代码如下
import cv2 import numpy as np img1 = np.zeros((150, 150, 3), np.uint8) # 创建150*150的0值图像 img1[:, :, 0] = 255 # 蓝色通道賦予最大值 img2 = np.zeros((150, 150, 3), np.uint8) img2[:, :, 2] = 255 # 红色通道賦予最大值 img = cv2.add(img1, img2) # 蓝色 + 红色 = 洋红色 cv2.imshow("no mask", img) # 展示相加的结果 m = np.zeros((150, 150, 1), np.uint8) # 创建掩模 m[50:100, 50:100, :] = 255 # 掩模中央位置为纯白色 cv2.imshow("mask", m) # 展示掩模 img = cv2.add(img1, img2, mask=m) # 相加时使用掩模 cv2.imshow("use mask", img) # 展示相加的结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
创作不易 觉得有帮助请点赞关注收藏~~~