pzo*_*pzo 34 python opencv mask image-processing
如何在最新的python绑定(cv2)中将蒙版应用于彩色图像?在以前的python绑定中,最简单的方法是使用cv.Copy例如
cv.Copy(dst, src, mask)
但是这个功能在cv2绑定中不可用.没有使用样板代码有没有解决方法?
Abi*_*n K 54
cv2.bitwise_and如果您已经有掩模图像,可以使用此功能.
要查看以下代码:
img = cv2.imread('lena.jpg')
mask = cv2.imread('mask.png',0)
res = cv2.bitwise_and(img,img,mask = mask)
Run Code Online (Sandbox Code Playgroud)
对于lena图像和矩形掩模,输出如下.

lmi*_*lmh 15
好吧,如果您希望背景不是纯黑色,这是一个解决方案.我们只需要反转蒙版并将其应用于相同大小的背景图像,然后将背景和前景结合起来.这个解决方案的专家是背景可以是任何东西(甚至是其他图像).
此示例是从霍夫圆变换修改的.第一个图像是OpenCV徽标,第二个是原始蒙版,第三个是背景+前景组合.
# http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html
import cv2
import numpy as np
# load the image
img = cv2.imread('E:\\FOTOS\\opencv\\opencv_logo.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# detect circles
gray = cv2.medianBlur(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY), 5)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=50, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
# draw mask
mask = np.full((img.shape[0], img.shape[1]), 0, dtype=np.uint8) # mask is only
for i in circles[0, :]:
cv2.circle(mask, (i[0], i[1]), i[2], (255, 255, 255), -1)
# get first masked value (foreground)
fg = cv2.bitwise_or(img, img, mask=mask)
# get second masked value (background) mask must be inverted
mask = cv2.bitwise_not(mask)
background = np.full(img.shape, 255, dtype=np.uint8)
bk = cv2.bitwise_or(background, background, mask=mask)
# combine foreground+background
final = cv2.bitwise_or(fg, bk)
Run Code Online (Sandbox Code Playgroud)
注意:最好使用opencv方法,因为它们已经过优化.
import cv2 as cv
im_color = cv.imread("lena.png", cv.IMREAD_COLOR)
im_gray = cv.cvtColor(im_color, cv.COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)
在这一点上,你有一个彩色和一个灰色的图像。我们在这里处理8-bit,uint8图像。这意味着图像可以具有范围内的像素值,[0, 255]并且这些值必须是整数。
让我们做一个二元阈值操作。它创建一个黑白蒙版图像。黑色区域有价值0,白色区域255
_, mask = cv.threshold(im_gray, thresh=180, maxval=255, type=cv.THRESH_BINARY)
im_thresh_gray = cv.bitwise_and(im_gray, mask)
Run Code Online (Sandbox Code Playgroud)
可以在左下方看到面具。右边的图像是bitwise_and灰度图像和蒙版之间应用操作的结果。发生的事情是,掩码具有像素值零(黑色)的空间位置在结果图像中变成了像素值零。蒙版像素值为 255(白色)的位置,生成的图像保留了其原始灰度值。
要将此蒙版应用到我们的原始彩色图像,我们需要将蒙版转换为 3 通道图像,因为原始彩色图像是 3 通道图像。
mask3 = cv.cvtColor(mask, cv.COLOR_GRAY2BGR) # 3 channel mask
Run Code Online (Sandbox Code Playgroud)
然后,我们可以使用相同的bitwise_and函数将此 3 通道蒙版应用于我们的彩色图像。
im_thresh_color = cv.bitwise_and(im_color, mask3)
Run Code Online (Sandbox Code Playgroud)
mask3来自代码的是下面左侧的图像,im_thresh_color右侧的图像。
您可以绘制结果并亲自查看。
cv.imshow("original image", im_color)
cv.imshow("binary mask", mask)
cv.imshow("3 channel mask", mask3)
cv.imshow("im_thresh_gray", im_thresh_gray)
cv.imshow("im_thresh_color", im_thresh_color)
cv.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
原图是lenacolor.png我在这里找到的。