cv2-图像运算-位运算
cv2-图像运算
图像相加
cv2.add(src1, src2, dst=None, mask=None, dtype=None)
src1:图像1
src1:图像2
mask:是否有掩膜
dtype:
cv2.add(img1, img2)
,也可以使用numpy数组的加法操作,res = img1+img2
不同的是对越界溢出的处理
cv2.add
取的是饱和值也就是最大范围值255,而+
饱和后重新计数(模操作)
import numpy as np
import cv2
x = np.uint8([240])
y = np.uint8([30])
print("x+y:", x + y)
print("cv2.add :", cv2.add(x, y))
#x+y: [14]
#cv2.add : [[255]]
图像相减
cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)
src1:图像1
src1:图像2
mask:是否有掩膜
dtype:
不同的是对越界溢出的处理
cv2.subtract
取的是饱和值也就是最小范围值0,而-
归0后重新计数(模操作)
import numpy as np
import cv2
x = np.uint8([150])
y = np.uint8([200])
print("x-y:", x - y)
print("cv2.subtract :", cv2.subtract(x, y))
#x-y: [206]
#cv2.subtract : [[0]]
图像加权相加
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
alpha
为src1
透明度,beta
为src2
透明度权重越大,透明度越低
# 底板图案
bottom_pic = 'elegent.jpg'
# 上层图案
top_pic = 'lena.jpg'
import cv2
bottom = cv2.imread(bottom_pic)
top = cv2.imread(top_pic)
# 权重越大,透明度越低
overlapping = cv2.addWeighted(bottom, 0.8, top, 0.2, 0)
# 保存叠加后的图片
cv2.imwrite('overlap(8:2).jpg', overlapping)
参考:https://blog.csdn.net/JNingWei
位运算
底层原理:二进制数据 全黑 0000000000000 全白 1111111111111111
“与”运算
bitwise_and(src1, src2, mask)
是对二进制数据进行“与”操作,即对图像每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
“或”运算
bitwise_or(src1, src2, mask)
bitwise_or
是对二进制数据进行“或”操作,即对图像每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
“异或”运算
bitwise_xor(src1, src2, mask)
bitwise_xor
是对二进制数据进行“异或”操作,即对图像每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
“非”运算
bitwise_not(src,mask)
bitwise_not
是对二进制数据进行“非”操作,即对图像每个像素值进行二进制“非”操作,~1=0,~0=1
- 1、src1.shape=src2.shape=(h,w,3) 3通道的
- 2、mask.shape=(h,w) 单通道的
应用
1、制作白色背景mark和黑色背景mark
通过非运算进行黑白反转
import cv2
import numpy as np
img = cv2.imread("E:\win.jpg")
# 坐标点points
pts = np.array([[(200, 200), (500,200), (500, 500), (200, 500)]], dtype=np.int32)
mask_backblack = np.zeros(img.shape[:2], np.uint8) # 全0
# 在mask上将多边形区域填充为白色
cv2.fillPoly(mask_backblack, pts, (255)) # 填充,用 255 填充
mask_backwhite = cv2.bitwise_not(mask_backblack) # 使用非运算反转
cv2.imwrite("mask_backblack.jpg", mask_backblack)
cv2.imwrite("mask_backblack.jpg", mask_backwhite)
2、任意裁剪图像
通过 与 运算将mark标记的图像和原图像运算
背景颜色是黑色0
import cv2
import numpy as np
img = cv2.imread("E:\win.jpg")
# 坐标点points
pts = np.array([[(200, 200), (500, 200), (500, 500), (200, 500)]], dtype=np.int32)
mask_backblack = np.zeros(img.shape[:2], np.uint8) # 全0
# 在mask上将多边形区域填充为白色
cv2.fillPoly(mask_backblack, pts, (255)) # 填充,用 255 填充
mask_backwhite = cv2.bitwise_not(mask_backblack) # 使用非运算反转
# 背景为黑色
dst_inmark = cv2.bitwise_and(img, img, mask=mask_backblack) # 提取mark位置
dst_outmark = cv2.bitwise_and(img, img, mask=mask_backwhite) # 提取非mark位置
cv2.imwrite("dst_inmark.jpg", dst_inmark)
cv2.imwrite("dst_outmark.jpg", dst_outmark)
3、其他颜色裁剪
其他背景颜色思路
1、先提取黑色背景的图片
2、制作其他背景的mark, mark颜色为黑色
3、将黑色背景的图片和该mark图片相加
import numpy as np
import cv2
img = cv2.imread("E:\win.jpg")
# 坐标点points
pts = np.array([[(200, 200), (500, 200), (500, 500), (200, 500)]], dtype=np.int32)
mask_backblack = np.zeros(img.shape[:2], np.uint8) # 全0
# 在mask上将多边形区域填充为白色
cv2.fillPoly(mask_backblack, pts, (255)) # 填充,用 255 填充
mask_backwhite = cv2.bitwise_not(mask_backblack) # 使用非运算反转
# 背景为黑色
dst_inmark = cv2.bitwise_and(img, img, mask=mask_backblack) # 提取mark位置
dst_outmark = cv2.bitwise_and(img, img, mask=mask_backwhite) # 提取非mark位置
cv2.imwrite("dst_inmark.jpg", dst_inmark)
cv2.imwrite("dst_outmark.jpg", dst_outmark)
other = np.ones_like(img) # 整块其他背景颜色
other[:, :, 0] *= 255
other[:, :, 1] *= 255
mask2 = np.ones(img.shape, np.uint8) * 255
mask2 = cv2.fillPoly(mask2, [pts], (0, 0, 0,))
other = cv2.bitwise_and(other, mask2)
other_color = dst_inmark + other
cv2.imwrite("mask2.jpg", other_color)