如何替换图像中彩色对象的颜色?

时间:2019-07-05 11:42:16

标签: python python-3.x opencv image-processing edge-detection

我正在尝试检测视频图像中的边缘,但是诸如canny之类的边缘检测方法不能很好地工作,这可能是由于盒子的颜色与地板颜色或亮度之间的相似性所致,所以我想找到一种方法来所有红色和蓝色框看起来都尽可能白,或者可能是检测每一帧尽可能完美的边缘的最佳方法,因为这是最终目标。

enter image description here

2 个答案:

答案 0 :(得分:1)

我建议您然后使用颜色跟踪。

  1. 转换为HSV

cv2.bgr2hsv

为什么要hsv?即使亮度发生变化,您仍然可以检测到该颜色

  1. 过滤

您可以使用cv2.inrange

  1. 降噪

使用cv2.Gaussianblur

  1. 轮廓

使用cv2.findContours

  1. 找到优势 使用您的方法

对每种颜色的包装盒重复此步骤

希望获得帮助

答案 1 :(得分:1)

只需完成我对您问题的评论。可以使用HSV / HLS色彩空间,并在Hue通道中使用inRanges。例如:

import numpy as np
import cv2

# load image and threshold it
original = cv2.imread("a.jpg")
hsvframe = cv2.cvtColor(original, cv2.COLOR_BGR2HLS)
mask = cv2.inRange(hsvframe, (160,40,40), (180, 255, 255))
mask = mask +  cv2.inRange(hsvframe, (0,40,40), (12, 255, 255)) # color red is at the beginning and end of the hue wheel

original[mask==255] = (0,255,0)
cv2.imshow("image", original)

cv2.waitKey(0)
cv2.destroyAllWindows()

需要记住的是,Hue在np.uint8中从0到180。这意味着,如果您需要色相300-360,则限制为150-180。其他两个值是0-255,其中255 = 100%。

这段小代码的结果是:

enter image description here

它不是完美的,但是可以使用另一种答案建议的方法对其进行优化。我希望这有帮助。