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

alphasrc1 透明度,betasrc2 透明度

权重越大,透明度越低

# 底板图案
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)

参考:https://blog.csdn.net/jnulzl/article/details/47129887

posted @ 2021-12-07 18:37  贝壳里的星海  阅读(648)  评论(0编辑  收藏  举报