该章内存取自OpenCV教程3_2_图像上的算法运算
这包括按位 AND、 OR、NOT 和 XOR 操作。它们在提取图像的任何部分(我们将在后面的章节中看到)、定义和处理非矩形 ROI 等方面非常有用。
下面我们将看到一个例子,如何改变一个图像的特定区域。 我想把HUST OpenCV 的标志放在一个图像上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是一个矩形区域,我可以使用 ROI,就像我们在上一章中所做的那样。
但是 HUST OpenCV 的 logo 不是长方形的。所以你可以使用如下的按位操作来实现:
获取图像
imgHUST = cv.imread('hust-logo-small.bmp')
img2 = cv.imread('moon.jpg')
获取imgHUST的放置矩阵
rows,cols,channels = imgHUST.shape
roi = img2[0:rows, 0:cols ]
showPicture(roi)
现在创建logo的掩码,并同时创建其相反掩码
1.转为灰度图
注意:灰度图0是黑,255是白
img2gray = cv.cvtColor(imgHUST,cv.COLOR_BGR2GRAY)
showPicture(img2gray)
2. 根据阈值设置掩码
若threshold_type=CV_THRESH_BINARY: 如果
s
r
c
(
x
,
y
)
>
t
h
r
e
s
h
o
l
d
,
d
s
t
(
x
,
y
)
=
m
a
x
_
v
a
l
u
e
;
src(x,y)>threshold ,dst(x,y) = max\_value;
src(x,y)>threshold,dst(x,y)=max_value; 否则:
d
s
t
(
x
,
y
)
=
0
dst(x,y)=0
dst(x,y)=0;
250为阈值threshold ,255为max_value 若灰度图大于250,则设置为纯白255,否则为纯黑0.
ret, mask = cv.threshold(img2gray,250, 255, cv.THRESH_BINARY)
showPicture(mask)
对图像取反
bitwise_not 按位取反
mask_inv = cv.bitwise_not(mask)
showPicture(mask_inv)
现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask)
与运算,有0(黑色)为0(黑色)
合成效果如下
仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(imgHUST,imgHUST,mask = mask_inv)
showPicture(img2_fg)
将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img2[0:rows, 0:cols ] = dst
showPicture(img2)
|