提高 OpenCV 中提取图像的质量

Improve quality of extracted image in OpenCV

#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()

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

您可以使用:

  1. 扩张以填充形状中的内部噪音
  2. 外部轮廓查找得到三角形的轮廓
  3. 凸包以进一步平滑它
import cv2
import numpy as np

img = cv2.imread('dCkpC.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

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

mask_red = cv2.inRange(hsv, lower_red, upper_red)
element = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
mask_red = cv2.dilate(mask_red, element)

contours, _ = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
hull_list = [cv2.convexHull(contour) for contour in contours]
drawing = np.zeros_like(img)
for hull in hull_list:
    cv2.fillConvexPoly(img, hull, (255, 0, 0))

cv2.imshow('Image', img)
cv2.imwrite('out.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

out.jpg 最终看起来像

三角形已经用蓝色填充了。

我看过 HSL/HSV space 中的频道。

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

那个红色箭头的色调在 0 度左右(红色)抖动...这意味着它的一些像素位于 0 的 一侧,即大约 359 度。

您需要使用两次 inRange 调用来收集从 0 开始的所有色调和从 359 开始的所有色调。由于 OpenCV 以 2 度为步长对色调进行编码,因此该值将为 180 及以下。我将 select 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()