OpenCV:去除图像的背景

3
我正在使用Opencv和Python来检测形状并进行裁剪。我已经成功完成了这一步骤,但现在我正在尝试取出被裁剪的图像并去除它们的背景。
图像内部有一个圆,周围是灰色(它可以是灰色或甚至多种颜色)。
如何去除圆边缘周围的颜色(黑色)-我们可以将灰色转换为黑色作为边框颜色,或者完全去除它并使其透明。
结果图像应该只包含圆形。

这个已解决的回答看起来非常接近 https://dev59.com/LFgQ5IYBdhLWcg3wvGcY - helloworld
1个回答

5
至少对于这张图片来说,没有必要使用houghCircle函数来检测圆形。我认为可以使用threshold函数和findContours函数找到内部轮廓,然后生成掩膜并进行位运算即可!

我的步骤:

(1) 读取并转换为灰度

(2) 查找轮廓

(3) 找到较小的轮廓,创建蒙版

(4) 对 crop 进行 bitwise_and 处理


这是我的结果:

enter image description here


#!/usr/bin/python3
# 2018.01.20 20:58:12 CST
# 2018.01.20 21:24:29 CST
import cv2
import numpy as np

## (1) Read
img = cv2.imread("img04.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## (2) Threshold
th, threshed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

## (3) Find the min-area contour
_cnts = cv2.findContours(threshed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]
cnts = sorted(cnts, key=cv2.contourArea)
for cnt in cnts:
    if cv2.contourArea(cnt) > 100:
        break

## (4) Create mask and do bitwise-op
mask = np.zeros(img.shape[:2],np.uint8)
cv2.drawContours(mask, [cnt],-1, 255, -1)
dst = cv2.bitwise_and(img, img, mask=mask)

## Save it
cv2.imwrite("dst.png", dst)

我已经尝试了两天,但毫无进展。需要帮助 :-( 请提供代码以便我可以跟随并学习。 - user9077223
谢谢。不幸的是,这只适用于灰色背景。我已经测试了灰色背景,它可以正常工作,但是如果背景有更多的彩色物体,那么它就无法正常工作。请参见附加链接中的图像。 我对所有这些图像处理和openCV都很陌生...所以请耐心等待我的提问:-) 在我的问题中,我写道:“图像内部有一个圆,周围是灰色(可以是灰色或甚至是多种颜色)。” 请查看以下图片链接:https://imgur.com/lQ0XQ8L https://imgur.com/UaYcH8f - user9077223
阅读我的回答的第一行:“至少对于这张图片来说…” - Kinght 金
你是正确的。那么,如果我使用我们用于裁剪最新圆形图像的houghCircle(一张图像包含主圆和圆区域外的灰色背景上的更多颜色),然后进行遮罩,这会有帮助吗?你能在这里给出提示和建议吗? - user9077223
请查看以下链接:https://dev59.com/Pqjja4cB1Zd3GeqP-WvX希望这很清楚。 - user9077223
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接