按位运算
这包括按位 AND 、 OR 、 NOT 和 XOR 操作。它们在提取图像的任何部分、定义和处理非矩形 ROI 等方面非常有用。 下面我们将看到一个例子,如何改变一个图像的特定区域。 我想把 OpenCV 的标志放在一个图像上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是一个矩形区域,我可以使用 ROI,但是 OpenCV 的 logo 不是长方形的,所以你可以使用如下的按位操作来实现:


import cv2 as cv
import numpy as np
# 加载两张图片
img1 = cv.imread('./data/messi5.jpg')
img2 = cv.imread('./data/opencv-logo.png')
# print(img1.dtype)
# print(img2.dtype)
# 我想把logo放在左上角,所以我创建了ROI
# 使用resize()使img2与img1图像高度相同
img2 = cv.resize(img2, (200, 342))
rows, cols, channels = img2.shape
# roi = img1[0:rows, 0:cols]
roi = img1[0:rows, 0:cols]
# 现在创建logo的掩码,并同时创建其相反掩码
# img2 = cv.resize(img2, (200, 342))
img2gray = cv.cvtColor(img2, cv. COLOR_BGR2GRAY)
# cv.imshow("gray", img2gray)
# cv.waitKey(0)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
# print(ret)
mask_inv = cv.bitwise_not(mask)
# 现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi, roi, mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2, img2, mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow("roi", roi)
cv.imshow("gray", img2gray)
cv.imshow("mask", mask)
cv.imshow('mask_inv', mask_inv)
cv.imshow("img1_bg", img1_bg)
cv.imshow("img2_fg", img2_fg)
cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()
请看下面的结果。下图显示了创建的mask及显示的最终结果。为了更好地理解,显示了上面代码中的所有中间映像,特别是 img1_bg 和 img2_fg。







本文介绍了如何使用OpenCV库在Python中进行按位图像运算,通过展示具体的实例,如创建mask和合并图像,来帮助读者深入理解这一过程。文章通过展示中间结果img1_bg和img2_fg等,清晰地呈现了图像处理的步骤。
3970

被折叠的 条评论
为什么被折叠?



