【问题标题】:Object Extraction and Construction对象提取与构造
【发布时间】:2021-01-16 13:56:52
【问题描述】:

我得到了下面的图像作为输入。

我想从图像中移除背景和黑色电缆,只保留红色电缆。 由于黑色电缆,因此在隐藏的任何地方也要构建红色电缆。

注意:仅允许使用图像处理技术。不允许使用 ML 或 DL。

在这种情况下,我想提取的是红线,但也可以是其他颜色,所以我想概括一下。

我想构造可以通过膨胀和腐蚀来完成。

但是请帮助我如何提取这个?

【问题讨论】:

  • 只要颜色与背景显着不同,您可以在 BGR 或 HSV 颜色空间中使用 cv2.inRange() 在某个容差范围内(最小值和最大值)仅对该颜色进行阈值处理
  • 您应该提供一些您尝试过的代码。这不是一个解决你作业的网站。

标签: python python-3.x opencv image-processing computer-vision


【解决方案1】:

为了提高结果你必须玩形态学操作,如果电缆的颜色不同你必须玩代码,没有通用解决方案,除了我可以说深度学习或机器学习可能会产生更好的结果。

  • 编辑:感谢@fmw42 提到cv.inRange(),我更改了部分代码以在HSV 空间中实现阈值。

#========================
# Import Libraies
#========================
import numpy as np 
import matplotlib.pyplot as plt 
import cv2 as cv 

#------------------------
# Read Image
#========================
img = cv.imread("img.jpg")
imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

#------------------------
# Threshold Image
#========================
## mask of red
mask1 = cv.inRange(imgHSV, (0, 30, 0), (10, 255,255))
mask2 = cv.inRange(imgHSV, (170, 30, 0), (180, 255,255))

mask = cv.bitwise_or(mask1, mask2)

mask = np.tile(mask, (3,1,1))
mask = np.swapaxes(mask , 0, 1)
mask  = np.swapaxes(mask , 1, 2)

print(mask.shape)

th1 = cv.bitwise_and(img,mask)

#------------------------
# Morphology
#========================
kernel1 = np.ones((7,7),np.uint8)
kernel2 = np.zeros((70,70),np.uint8)
kernel2[10:60, 10:60] = 1

img_opn = cv.morphologyEx(th1 ,cv.MORPH_OPEN ,kernel1)
img_cls = cv.morphologyEx(img_opn, cv.MORPH_CLOSE, kernel2)

#------------------------
# Results Visualization
#========================
plt.figure(num = "Red Cable")

plt.subplot(221)
plt.imshow(img)
plt.title('Original')
plt.axis('off')

plt.subplot(222)
plt.imshow(th1)
plt.title('Thresholded')
plt.axis('off')

plt.subplot(223)
plt.imshow(img_opn)
plt.title('Opening')
plt.axis('off')

plt.subplot(224)
plt.imshow(img_cls)
plt.title('Result')
plt.axis('off')

plt.show()
#------------------------
#------------------------

【讨论】:

  • 使用 cv2.inRange 的颜色阈值可能比简单的阈值更好。
  • @fmw42 感谢您的反馈,我只是一个初学者,我没有长期使用 Open-CV 的经验,所以我会阅读并尝试实施它。
  • 你必须先知道颜色才能使用 cv2.inRange()。如果您只有一根颜色线并且图像的其余部分是灰度的,那么您可以转换为 HSV 颜色空间和饱和度通道上的阈值,因为灰色/黑色/白色的饱和度非常低,而任何颜色的饱和度都会更高。
  • 谢谢你,但是如果两条线的颜色相似呢?
  • @Ttpwaala 如果颜色相似,那么你必须寻找另一个判别特征,这取决于图像,以及你要分割的对象。跨度>
【解决方案2】:

您可以只查看每个像素,如果像素不接近红色阈值,则将其删除。您将必须了解 RGB 颜色表示。此解决方案不会保留图像中的白帽。

【讨论】:

  • 对不起,电线可以是任何颜色的。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2019-09-12
  • 2017-04-12
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多