python - 如何在不影响图像其余部分的情况下删除图像中的外圈?

标签 python python-3.x opencv image-processing

我有一张类似于下图的图片。 enter image description here

我想同时删除图像的黑色和红色圆圈而不影响图像内部的红色方 block (因为红色圆圈和红色方 block 具有相同的像素值)。

我曾尝试使用 cv2.HoughCircles 检测红色圆圈并尝试将其转换为黑色,但红色圆圈的某些部分保持不变,如图所示。

enter image description here

这是我为此使用的代码。

import numpy as np
import cv2

image = cv2.imread("13-14.png")
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.3, 145)

if circles is not None:
    circles = np.round(circles[0, :]).astype("int")

    for (x, y, r) in circles:
        cv2.circle(output, (x, y), r, (0, 0 , 0), 4)

cv2.imshow("output", np.hstack([image, output]))
cv2.waitKey(0)

有什么建议吗?提前致谢。

编辑 1

我正在寻找的示例输出是这种图像(彩色或灰度)。

enter image description here

最佳答案

由于正方形似乎“明显”大于圆圈的厚度,因此使用一些矩形内核(以保持正方形的形状)的简单形态学开运算应该在这里起作用。

这就是我的解决方案:

import cv2
from skimage import io          # Only needed for web grabbing images; for local images, use cv2.imread(...)

# Read provided example image
image = cv2.cvtColor(io.imread('/image/QfUOF.png'), cv2.COLOR_RGB2BGR)

# Mask non-white content
_, mask = cv2.threshold(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 252, 255, cv2.THRESH_BINARY_INV)

# Apply morphological opening with 5x5 rectangular kernel to get rid of the circles
mod = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)))

# Obtain mask of parts to be erased from the difference of both masks
erase = mask - mod

# Set corresponding pixels in image to white
image[erase == 255] = (255, 255, 255)

cv2.imshow('mask', mask)
cv2.imshow('mod', mod)
cv2.imshow('erase', erase)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

非白色内容 mask 看起来像这样:

Mask

打开mod后修改后的mask是这样的:

Modified mask

两者的区别在于需要删除的部分(erase):

To be erased

最后,所有被屏蔽的像素都设置为白色:

Output

希望对您有所帮助!

关于python - 如何在不影响图像其余部分的情况下删除图像中的外圈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58694461/

相关文章:

Python从数据库中读取数据并重写到另一个表中

docker中的python记录器不工作

python - 8 或 9 个字母的回文错误

Python asyncio任务列表生成而不执行函数

java - 在某些条件下最大化 GCD

python - 互斥关键字参数的优雅模式?

python - 结构化 numpy 数组的索引

qt - Qt试图包括openCV库文件

Python OpenCV 如何在转换后保存图像

python - OpenCV Python OpenGL 纹理