如何替换图像中彩色对象的颜色?
How to replace color for colored objects in image?
我正在尝试检测视频图像中的边缘,但 canny 等边缘检测方法效果不佳,可能是由于框的颜色与地板颜色或亮度之间的相似性,所以我想找到一种方法使所有红色和蓝色框看起来尽可能白,或者可能是为每一帧尽可能完美地检测边缘的最佳方法,因为这是最终目标。
那我建议你使用颜色跟踪。
- 转换为 HSV
cv2.bgr2hsv
为什么是 hsv?即使亮度发生变化,您仍然可以检测到该颜色
- 过滤
您可以使用cv2.inrange
- 降噪
使用cv2.Gaussianblur
- 修容
使用cv2.findContours
- 求边
使用你的方法
对盒子的每种颜色重复此步骤
希望对您有所帮助
只是为了完成我对你的问题的评论。可以使用 HSV/HLS 色彩空间,并将 inRanges 与 Hue 通道一起使用。例如:
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()
需要记住的事情,色调在 np.uint8 中从 0-180 变化。这意味着如果您需要色调 300-360,则限制将为 150-180。其他两个值是 0-255,其中 255 = 100%。
这段小代码的结果是:
它并不完美,但可以使用其他答案建议的方法对其进行改进。我希望这有帮助。
我正在尝试检测视频图像中的边缘,但 canny 等边缘检测方法效果不佳,可能是由于框的颜色与地板颜色或亮度之间的相似性,所以我想找到一种方法使所有红色和蓝色框看起来尽可能白,或者可能是为每一帧尽可能完美地检测边缘的最佳方法,因为这是最终目标。
那我建议你使用颜色跟踪。
- 转换为 HSV
cv2.bgr2hsv
为什么是 hsv?即使亮度发生变化,您仍然可以检测到该颜色
- 过滤
您可以使用cv2.inrange
- 降噪
使用cv2.Gaussianblur
- 修容
使用cv2.findContours
- 求边 使用你的方法
对盒子的每种颜色重复此步骤
希望对您有所帮助
只是为了完成我对你的问题的评论。可以使用 HSV/HLS 色彩空间,并将 inRanges 与 Hue 通道一起使用。例如:
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()
需要记住的事情,色调在 np.uint8 中从 0-180 变化。这意味着如果您需要色调 300-360,则限制将为 150-180。其他两个值是 0-255,其中 255 = 100%。
这段小代码的结果是:
它并不完美,但可以使用其他答案建议的方法对其进行改进。我希望这有帮助。