提高 OpenCV 中提取图像的质量

uni*_*mer 5 python opencv hsv

#Segmenting the red pointer
img = cv2.imread('flatmap.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_red = np.array([140, 110, 0])
upper_red = np.array([255, 255 , 255])

# Threshold with inRange() get only specific colors
mask_red = cv2.inRange(hsv, lower_red, upper_red)

# Perform bitwise operation with the masks and original image
red_pointer = cv2.bitwise_and(img,img, mask= mask_red)

# Display results
cv2.imshow('Red pointer', red_pointer)
cv2.imwrite('redpointer.jpg', red_pointer)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

我有一张地图,需要提取红色箭头。代码有效,但箭头中有黑色斑点。我将如何更改代码以改进箭头的输出,使其成为实体形状?

地图

箭

Chr*_*itz 0

我查看了 HSL/HSV 空间中的通道。

箭头是图片中唯一具有饱和度的东西。这将是锁定所需箭头所需的(但不充分)方面之一。我选择了这些像素,它们的饱和度似乎略高于 50%,因此我将使用 25% (64) 的下限。

饱和

红色箭头的色调在 0 度(红色)附近抖动……这意味着它的某些像素位于0 的负数,即 359 度之类的值。

色相 色相 色相

您需要使用两次inRange调用来收集从 0 向上的所有色调以及从 359 向下的所有色调。由于 OpenCV 以 2 度为步长对色调进行编码,因此该值将为 180 及以下。我将选择 0 ± 20 度(0 .. 10170 .. 180)。

总之:

hsv_im = cv.cvtColor(im, cv.COLOR_BGR2HSV)

mask1 = cv.inRange(hsv_im, np.array([0, 64, 0]), np.array([10, 255, 255]))
mask2 = cv.inRange(hsv_im, np.array([170, 64, 0]), np.array([180, 255, 255]))
mask = mask1 | mask2

cv.imshow("mask", mask)
cv.waitKey()
Run Code Online (Sandbox Code Playgroud)

面具