1、图像的掩模加法
图像掩模(mask),是用特定的图像或函数对目标图像进行覆盖或遮蔽 ,来控制图像处理的区域或图像处理的过程。图像掩模主要用于提取感兴趣区域(ROI)、提取结构特征、或制作特殊形状的图像。
函数 cv2.add() 用于图像的加法运算,可以使用掩模图像进行遮蔽。对被掩模图像遮蔽的黑色区域不进行处理,保持黑色。
cv2.add(src1, src2 [, dst[, mask[, dtype]]) → dst
注意:
1.掩模图像mask为8位灰度格式,遮蔽区域位黑色(数值为0),非遮蔽区域为白色(数值为255)。
2.图像src1和src2 形状必须相同。
# 掩膜操作(mask)
import cv2
import numpy as np
img1 = cv2.imread("test1.jpg") # 读取彩色图像(BGR)
img2 = cv2.imread("test2.jpg") # 读取彩色图像(BGR)
Mask = np.zeros((img1.shape[0], img1.shape[1]), dtype=np.uint8) # 创建一个图像 img1 尺寸相同的全零数组(全黑)
xmin, ymin, w, h = 180, 190, 200, 200 # 矩形裁剪区域 (ymin:ymin+h, xmin:xmin+w) 的位置参数
Mask[ymin:ymin + h, xmin:xmin + w] = 255 # 掩模图像,ROI 为白色,其它区域为黑色
print(img1.shape, img2.shape, Mask.shape)
imgAddMask1 = cv2.add(img1, img2, mask=Mask) # 带有掩模 mask 的加法
imgAddMask2 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask) # 提取 ROI
cv2.imshow("MaskImage", Mask) # 显示掩模图像 Mask
cv2.imshow("MaskAdd", imgAddMask1) # 显示掩模加法结果 imgAddMask1
cv2.imshow("MaskROI", imgAddMask2) # 显示从 img1 提取的 ROI
key = cv2.waitKey(0) # 等待按键命令
2、圆形遮罩
用cv2.circle()设计圆形遮罩,cv2.ellipse()设计椭圆形遮罩。
# 圆形和其他形状的遮罩
import cv2
import numpy as np
img1 = cv2.imread("test1.jpg") # 读取彩色图像(BGR)
img2 = cv2.imread("test2.jpg") # 读取彩色图像(BGR)
Mask1 = np.zeros((img1.shape[0],img1.shape[1]),dtype=np.uint8)
Mask2 = Mask1.copy()
# cv2.circle() 参数 1.目标图片 2.圆心位置 3.圆的半径 4.圆的颜色 5.圆形轮廓粗细,负厚度表示绘制实心圆
cv2.circle(Mask1, (285, 285), 110, (255, 255, 255), -1)
# cv2.ellipse() 参数 1.目标图片 2.椭圆圆心 3.长短轴长度 4.偏转角度 5.圆弧起始角度 6.终止角度 7.颜色 8.是否填充
cv2.ellipse(Mask2, (285, 285), (100, 150), 0, 0, 360, 255, -1)
imgAddMask1 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask1) # 提取圆形 ROI
imgAddMask2 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask2) # 提取椭圆
cv2.imshow("circularMask", Mask1) # 显示掩模图像 Mask
cv2.imshow("circularROI", imgAddMask1) # 显示掩模加法结果 imgAddMask1
cv2.imshow("ellipseROI", imgAddMask2) # 显示掩模加法结果 imgAddMask2
key = cv2.waitKey(0) # 等待按键命令
3、图像的按位运算
OpenCV 里 cv2. bitwise() 提供了图像的位运算,
cv.bitwise_and(src1, src2[, dst[, mask]] → dst # 位操作: 与
cv.bitwise_or(src1, src2[, dst[, mask]] → dst # 位操作: 或
cv.bitwise_xor(src1, src2[, dst[, mask]] → dst # 位操作: 与或
cv.bitwise_not(src1, src2[, dst[, mask]] → dst # 位操作: 非(取反)
cv2.bitwise()位运算包含四种方法:与、或、与或、非。计算方式是对图像的像素点值的位运算。流程为先将图像中的每个像素的数值转换为二进制,进行位操作后再将结果转换为十进制。
# 图像按位运算基本操作
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread("test1.jpg")
img2 = cv2.imread("test2.jpg")
imgAnd = cv2.bitwise_and(img1,img2) # 与操作
imgOr = cv2.bitwise_or(img1,img2) # 或操作
imgNot = cv2.bitwise_not(img1) # 非操作
imgXor = cv2.bitwise_xor(img1,img2) # 异或操作
# 画图显示
plt.figure(figsize=(9,6))
titleList = ["img1", "img2", "and", "or", "not", "xor"]
imageList = [img1, img2, imgAnd, imgOr, imgNot, imgXor]
for i in range(6):
plt.subplot(2,3,i+1),plt.title(titleList[i]),plt.axis("off")
plt.imshow(cv2.cvtColor(imageList[i],cv2.COLOR_BGR2RGB),"gray")
plt.show()
声明:本文是向博主「youcans_」OpenCV例程300篇学习的自用学习笔记
原文链接:【youcans@qq.com, youcans的OpenCV例程300篇, https://blog.csdn.net/youcans/category_11459626.html】