使用 OpenCV 阈值电阻带

Posted

技术标签:

【中文标题】使用 OpenCV 阈值电阻带【英文标题】:Thresholding Resistor Bands with OpenCV 【发布时间】:2020-03-07 08:24:19 【问题描述】:

所以我正在尝试创建一个神经网络,通过识别色带来对电阻强度进行分类。在开始这一步之前,我想使用 OpenCV 对除电阻带以外的所有颜色进行阈值处理,以便神经网络更容易分类。但是我不知道哪种阈值类型最适合这个。

我尝试了 HLS、RGB 和 HSV 的几个范围,但它们都没有摆脱电阻器的背景。

注意:我已经用轮廓去除了背景,所以现在剩下的就是上面有彩色线条的电阻了。

在我的例子中,HLS 去掉了颜色,但保留了电阻背景,如下面的代码所示

frame_HLS = cv2.cvtColor(masked_data, cv2.COLOR_BGR2HLS)
frame_threshold = cv2.inRange(frame_HLS, (50, 0, 0), (139, 149, 255))

这是原始图像的图像,以及 HLS 输出

总的来说,我只是想知道是否有人知道 LUV 等其他颜色模式是否适用于此,或者我是否只需要使用轮廓或其他方法将它们分开。

【问题讨论】:

【参考方案1】:

您在正确的轨道上,颜色阈值是分割电阻器的好方法。目前,阈值处理正常,您只需执行几个简单的步骤即可移除背景。

我尝试了几个范围的 HLS、RGB 和 HSV,但它们都没有摆脱电阻的背景。

要去除背景,我们可以使用cv2.inRange() 生成的二进制掩码。我们只需使用cv2.bitwise_and() 并通过这两行将遮罩上的所有黑色像素转换为白色

result = cv2.bitwise_and(original, original, mask=frame_threshold)
result[frame_threshold==0] = (255,255,255)

这是您当前拥有的蒙版图像(左)和移除背景后(右)

import cv2

image = cv2.imread('1.png')
original = image.copy()
frame_HLS = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)
frame_threshold = cv2.inRange(frame_HLS, (50, 0, 0), (139, 149, 255))

result = cv2.bitwise_and(original, original, mask=frame_threshold)
result[frame_threshold==0] = (255,255,255)

cv2.imshow('result', result)
cv2.waitKey()

但是我不知道哪种阈值类型最适合这个。

现在您正在使用颜色阈值,您可以继续使用此方法并尝试 HLS、RGB 或 HSV 颜色空间中的其他范围。在所有这些情况下,您都可以通过将蒙版上的所有黑色像素转换为白色来移除背景。如果您决定转向另一种阈值方法,请查看自动计算阈值的 Otsu's threshold 或 Adaptive thresholding。

【讨论】:

以上是关于使用 OpenCV 阈值电阻带的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenCV 阈值与 Kinect 图像结合使用

使用 OpenCV 的最大熵阈值

使用某些 OpenCV 函数“阈值”Eclipse 时出现链接错误

OpenCV—图像阈值

OpenCV 自适应阈值 OCR

youcans 的 OpenCV 例程200篇164.使用 Laplace 边缘信息改进全局阈值处理