提高 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()
我有一张地图,需要提取红色箭头。该代码有效,但箭头中有黑色补丁。我将如何着手更改代码以改进箭头的输出,使其成为实心形状?
您可以使用:
- 扩张以填充形状中的内部噪音
- 外部轮廓查找得到三角形的轮廓
- 凸包以进一步平滑它
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 .. 10
和 170 .. 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()
#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()
我有一张地图,需要提取红色箭头。该代码有效,但箭头中有黑色补丁。我将如何着手更改代码以改进箭头的输出,使其成为实心形状?
您可以使用:
- 扩张以填充形状中的内部噪音
- 外部轮廓查找得到三角形的轮廓
- 凸包以进一步平滑它
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 .. 10
和 170 .. 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()