gpt4 book ai didi

python - 如何在 Python 中使用 OpenCV 提取图像的特定部分?

转载 作者:太空狗 更新时间:2023-10-30 01:25:42 25 4
gpt4 key购买 nike

我正在尝试通过执行 Canny 边缘检测来提取图像的一部分。我已成功创建该对象的蒙版。但是当我对原始图像执行 bitwise_and 操作以提取前景部分时,出现以下错误。

OpenCV Error: Assertion failed ((mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1)) in cv::binary_op, file C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp, line 241
Traceback (most recent call last):
File "C:\Users\Boudhayan Dev\Desktop\extraction.py", line 37, in <module>
new_image = cv2.bitwise_and(img_rgb,img_rgb,mask=mask)
cv2.error: C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:241: error: (-215) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function cv::binary_op

我的代码如下-

import cv2
import numpy as np

img_rgb = cv2.imread("3.jpg")
cv2.namedWindow("Original Image",cv2.WINDOW_NORMAL)

img = cv2.cvtColor(img_rgb,cv2.COLOR_RGB2HSV)
img = cv2.bilateralFilter(img,9,105,105)
r,g,b=cv2.split(img)
equalize1= cv2.equalizeHist(r)
equalize2= cv2.equalizeHist(g)
equalize3= cv2.equalizeHist(b)
equalize=cv2.merge((r,g,b))

equalize = cv2.cvtColor(equalize,cv2.COLOR_RGB2GRAY)

ret,thresh_image = cv2.threshold(equalize,0,255,cv2.THRESH_OTSU+cv2.THRESH_BINARY)
equalize= cv2.equalizeHist(thresh_image)


canny_image = cv2.Canny(equalize,250,255)
canny_image = cv2.convertScaleAbs(canny_image)
kernel = np.ones((3,3), np.uint8)
dilated_image = cv2.dilate(canny_image,kernel,iterations=1)


new,contours, hierarchy = cv2.findContours(dilated_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours= sorted(contours, key = cv2.contourArea, reverse = True)[:10]
c=contours[0]
print(cv2.contourArea(c))
final = cv2.drawContours(img, [c], -1, (255,0, 0), 3)



mask = np.zeros(img_rgb.shape,np.uint8)
new_image = cv2.drawContours(mask,[c],0,255,-1,)
new_image = cv2.bitwise_and(img_rgb,img_rgb,mask=mask)


cv2.namedWindow("new",cv2.WINDOW_NORMAL)
cv2.imshow("new",new_image)

cv2.imshow("Original Image",img)
cv2.waitKey()

注意:- 如果我尝试对图像的灰度版本执行 bitwise_and,代码工作正常。但是 RGB、HSV 或任何其他颜色空间会出现上述错误。

请帮忙。


编辑 1 - 有问题的图像是这样的-

3.jpeg

编辑 2-

下面是使用Numpy方法后的结果。如您所见,提取的图像与橙色大小相同,但它不包含橙色,而是蒙版本身。

result

EDIT 3- @DanMašek 和@lightalchemist,我终于可以提取任何前景图像了。

result1

result2

谢谢

最佳答案

我使用了上面提供的代码,但只更改了使用 cv2.bitwise_and() 的行:

new_image = cv2.bitwise_and(img_rgb, img_rgb, mask = equalize)

这是我得到的和你期望的(我猜):

enter image description here

编辑

我明白了,您想用具有最大面积的轮廓图像来遮盖图像。在下面的附加代码片段中,我对包含用作掩码的最大区域轮廓的图像进行了二值化。

new_image = cv2.drawContours(mask,[c], -1, (255,255,255), -1)
new_image_gray = cv2.cvtColor(new_image, cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(new_image_gray, 100, 255, cv2.THRESH_BINARY)
final = cv2.bitwise_and(img_rgb, img_rgb, mask = thresh1)

这是我得到的:

enter image description here

与上图相比,您在感兴趣的物体内部看不到这些孔。

关于python - 如何在 Python 中使用 OpenCV 提取图像的特定部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49946528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com