关于#二值化#的问题,如何解决?

如何将图片内橙色线框起来的区域内部颜色不变,框外背景颜色变为黑色?希望用Python实现。

img

该回答引用ChatGPT

要实现这个功能,需要用到Python中的图像处理库OpenCV。以下是实现该功能的基本步骤:

1、读取图片,将其转换为灰度图像。

2、对灰度图像进行阈值处理,将橙色线框起来的区域变为白色,其他区域变为黑色。

3、对阈值处理后的图像进行膨胀操作,以填补橙色线周围的空隙。

4、对膨胀后的图像进行轮廓检测,找到橙色线的轮廓。

5、根据轮廓信息,创建一个与原图像大小相同的全黑图像。

6、在全黑图像上,用白色填充橙色线框起来的区域。

7、将原图像和填充后的全黑图像进行按位与操作,得到最终的结果。

下面是实现该功能的示例代码:


import cv2
import numpy as np

# 读取图片并转换为灰度图像
img = cv2.imread('img.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 对灰度图像进行阈值处理,将橙色线框起来的区域变为白色,其他区域变为黑色
thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)[1]

# 对阈值处理后的图像进行膨胀操作
kernel = np.ones((5,5), np.uint8)
dilation = cv2.dilate(thresh, kernel, iterations=2)

# 对膨胀后的图像进行轮廓检测,找到橙色线的轮廓
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 创建一个与原图像大小相同的全黑图像
mask = np.zeros_like(img)

# 在全黑图像上,用白色填充橙色线框起来的区域
cv2.drawContours(mask, contours, -1, (255,255,255), thickness=-1)

# 将原图像和填充后的全黑图像进行按位与操作,得到最终的结果
result = cv2.bitwise_and(img, mask)

# 将框外背景颜色变为黑色
result[np.where((result == [0,0,0]).all(axis=2))] = [0,0,0]

# 显示最终结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓填充

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^