【问题标题】:OpenCV : Remove background of an imageOpenCV:删除图像的背景
【发布时间】:2018-01-20 12:55:55
【问题描述】:

我正在使用 Opencv 和 python 来检测形状然后裁剪它们。我已经成功地做到了,但是现在我正在尝试拍摄裁剪后的图像并删除它们的背景。

图像内部有一个圆圈,周围是灰色。 (它可以是灰色的,也可以是不止一种颜色)。

如何移除圆形边框(黑色)周围的颜色 - 我们可以将灰色转换为黑色 - 作为边框颜色,甚至完全移除它并使其透明。

结果图像应该只包含圆圈。

【问题讨论】:

标签: python image opencv image-processing


【解决方案1】:

至少在这张图片中,不需要检测圆圈使用houghCircle)。我认为 thresholdfind the inner contour ,然后 make maskdo bitwise-op 就可以了!

我的步骤:

(1) 读取并转换为灰色

(2) 查找轮廓

(3) 找到更小的轮廓,创建一个遮罩

(4) 将bitwise_and 转为crop


这是我的结果:


#!/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)

【讨论】:

  • 我从 2 天开始就在尝试。没有成功。需要帮助 :-( 代码可以提供帮助,以便我可以跟随和学习
  • 谢谢。不幸的是,这只适用于背景为灰色的情况。我已经用灰色背景对其进行了测试,它工作正常,但是如果背景有更多彩色物体,所以这不起作用。 - 请参阅图片附加链接。我是所有这些图像处理和openCV的新手..所以请耐心等待我:-)在我的问题中我写道:“图像里面有一个圆圈,周围是灰色。(它可以是灰色的,也可以是灰色的)不止一种颜色)。”请在此处查看图片:imgur.com/lQ0XQ8Limgur.com/UaYcH8f
  • 阅读我回答的第一行:At least for this image ...
  • 你是对的。因此,如果我使用我们用于裁剪最新圆形图像的 houghCircle(图像包含主圆形和圆形区域外的灰色背景上的更多颜色)然后遮盖它会有所帮助吗?你能在这里给出提示和技巧吗?
  • 老实说,我不会再提供任何建议,除非你的问题足够清楚,并且有所有明确的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多