使用 OpenCV 的阈值电阻带

Thresholding Resistor Bands with OpenCV

所以我正在尝试制作一个神经网络,通过识别色带来对电阻器强度进行分类。在进行该步骤之前,我想使用 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 这样的其他颜色模式是否适用于此,或者我是否只需要使用轮廓或其他方法来分离它们。

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

I tried several ranges of HLS, RGB, and HSV, but they all do not get rid of the background of the resistor.

要删除背景,我们可以使用 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()

However I do not know what threshold type is best suited for this.

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