文章目录
像素运算
注意:
需要两张图片大小格式完全一样
cv2.add
两张图片相加
add(src1, src2[, dst[, mask[, dtype]]]) -> dst
注意:
大于255的使用255计数
cv2.subtract
两张图片相减
subtract(src1, src2[, dst[, mask[, dtype]]]) -> dst
cv2.multiply
两张图片相乘(点乘)
multiply(src1, src2[, dst[, scale[, dtype]]]) -> dst
图1:
图2:
相乘结果:
注意:
因为Linux这张图是抗锯齿的,边缘经过光滑处理。黑白图像边缘并不完全是黑白的。
cv2.divide
两张图片相除
divide(src1, src2[, dst[, scale[, dtype]]]) -> dst
cv2.bitwise_and
对像素的二进制数据进行“与”操作
bitwise_and(src1, src2[, dst[, mask]]) -> dst
cv2.bitwise_or
对像素的二进制数据进行“或”操作
bitwise_or(src1, src2[, dst[, mask]]) -> dst
cv2.bitwise_not
对像素的二进制数据进行“非”操作
bitwise_not(src[, dst[, mask]]) -> dst
注意:
bitwise_not()只需要三个参数
cv2.bitwise_xor
对像素的二进制数据进行“异或”操作
bitwise_xor(src1, src2[, dst[, mask]]) -> dst
掩膜
图像掩膜,是用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
- 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
- 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
- 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
cv2.addWeighted
计算两个数组的加权和,将两个图片进行重叠操作
addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
d s t = s r c 1 ∗ a l p h a + s r c 2 ∗ b e t a + g a m m a dst = src1*alpha + src2*beta + gamma dst=src1∗alpha+src2∗beta+gamma
示例
修改图片对比度、亮度
def contrast_brightness(image, constract, brightness):
"""
修改图片的对比度与亮度,参数分别为:第一张图,第一张图权重,第二张图,第二张图权重,增强的亮度
"""
h, w, ch = image.shape
mask = np.zeros([h, w, ch], image.dtype)
# 图像混合,参数分别为:第一张图,第一张图权重,第二张图,第二张图权重,增强的亮度
dst = cv.addWeighted(image, constract, mask, 1 - constract, brightness)
cv.imshow("contrast_brightness", dst)
结果:
示例
从视频中提取指定颜色范围,彩色
def extract_object_color():
"""从视频中提取指定颜色范围,彩色"""
capture = cv.VideoCapture("car.mp4")
while True:
ret, frame = capture.read()
if not ret:
break
hsv = cv.cvtColor(frame, cv.COLOR_RGB2HSV)
lower_hsv = np.array([35, 43, 46]) # hsv的最小值
upper_hsv = np.array([77, 255, 255]) # hsv的最大值
# 用inRange函数提取指定颜色范围,这里是对hsv来处理
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
dst = cv.bitwise_and(frame, frame, mask=mask)
# cv.imshow("mask", mask)
cv.imshow("dst", dst)
keyboard = cv.waitKey(40) # 40ms一帧
if keyboard == 27:
break
结果:
错误记录
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
dst = cv.bitwise_and(frame, frame, mask)
这样会出不来结果,原因是函数有四个参数,如果直接写mask,位置传参会错误,需要对mask进行说明。
如下:
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
dst = cv.bitwise_and(frame, frame, mask=mask)
参考链接: