OpenCV-Python小白进阶之位运算与掩膜

OpenCV-Python小白进阶之位运算与掩膜

位运算

由于图片是有一个个0和1组成的,所以OpenCV中对图像也支持为运算(与或非等)

dst = cv2.bitwise_and(src1,src2[,dst[,mask]])
dst	= cv2.bitwise_not(src[, dst[, mask]])
dst	= cv2.bitwise_or(src1, src2[, dst[, mask]])
dst	= cv2.bitwise_xor(src1, src2[, dst[, mask]])
bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0

bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0

bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,11=0,10=1,01=1,00=0

bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,1=0,0=1

import numpy as np
import cv2

img = cv2.imread('cv.jpg')
# cv2.imshow('image',img)

rectangle = np.zeros(img.shape[0:2], dtype='uint8')
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
cv2.imshow('rectangle', rectangle)

circle = np.zeros(img.shape[0:2], dtype='uint8')
cv2.circle(circle, (150, 150), 150, 255, -1)
cv2.imshow('circle', circle)

bit_and = cv2.bitwise_and(rectangle, circle)
cv2.imshow('and', bit_and)

bit_or = cv2.bitwise_or(rectangle, circle)
cv2.imshow('or', bit_or)

bit_xor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow('xor', bit_xor)

bit_not1 = cv2.bitwise_not(rectangle)
cv2.imshow('not1', bit_not1)

bit_not2 = cv2.bitwise_not(circle)
cv2.imshow('not2', bit_not2)

while (True):
    if cv2.waitKey(0)==27:
        break
cv2.destroyAllWindows()

OpenCV-Python小白进阶之位运算与掩膜_第1张图片
OpenCV-Python小白进阶之位运算与掩膜_第2张图片OpenCV-Python小白进阶之位运算与掩膜_第3张图片
OpenCV-Python小白进阶之位运算与掩膜_第4张图片
OpenCV-Python小白进阶之位运算与掩膜_第5张图片
OpenCV-Python小白进阶之位运算与掩膜_第6张图片
OpenCV-Python小白进阶之位运算与掩膜_第7张图片
OpenCV-Python小白进阶之位运算与掩膜_第8张图片

掩膜

用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

数字图像处理中,图像掩模主要用于:

①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。

②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

④特殊形状图像的制作。
掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个n*n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。

import cv2 as cv

cv.namedWindow('image', 0)
cv.resizeWindow('image', 720, 480)
# 加载两张图片
img1 = cv.imread('a.jpg')
img2 = cv.imread('a.jpeg')

# 我想在左上角放置标识,所以我创建了一个ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 现在创建一个徽标掩码并创建其反转掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 现在使ROI中的徽标区域变黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从徽标图像中获取徽标区域。
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 在ROI中放置徽标并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('image',img1)
cv.waitKey(0)
cv.destroyAllWindows()

[外链图片转存失败(img-aMf8bhSC-1566195750154)(cv1.jpg)]

你可能感兴趣的:(OpenCV)