从橙色动态检测红色的阈值方法
Posted
技术标签:
【中文标题】从橙色动态检测红色的阈值方法【英文标题】:Threshold method to detect dynamically red from orange 【发布时间】:2021-09-20 23:34:29 【问题描述】:我希望能够动态地将图像上的橙色部分与红色部分分开。目前我正在使用范围,但范围的问题是它们是固定的,图像质量很差,橙色部分变得更红一点,或者红色部分变得更橙色一点,但仍然是这些部分保持肉眼可识别和区分。我正在考虑使用阈值来动态确定这些颜色,但我做不到。你对我有什么想法吗?
可能会出现图像质量较差且红色部分不再那么红的情况,但在此之前您仍然可以很好地区分不同的部分。然后,当我尝试您的答案时,它并没有完全做到它应该做的事情。
【问题讨论】:
您使用的是“范围”?提供详细信息(即代码)。你应该在 HSV 领域工作。 我已经在 HSV 领域工作了。当我谈论“范围”时,我的意思是 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, (0, 20, 0), (13, 255, 255)) mask2 = cv2.inRange (hsv, (160, 20, 0), (180, 255, 255)) 然后尝试 k-means 聚类,k=3 用于背景和两个前景(如果只选择前景像素,则 k=2)。希望它做正确的事。您可以在 RGB 元组或 HSV 元组上运行它。也许运行 ImageJ 并直观地探索数据的颜色直方图。 otsu 阈值也可能会起作用,如果您将颜色空间转换为主轴表示黄色/橙色与红色/粉红色的东西 【参考方案1】:如果您有干净的图像,例如提供的没有嘈杂背景的图像,并且您想要区分 Red 和 Orange 的颜色,即 Red + Green,我建议在绿色通道上做thresholding,可以很好地看到两种颜色之间的差异:
import cv2
import numpy as np
img = cv2.imread('input.png')
green = img[...,1]
mask = cv2.threshold(green, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
Orange = cv2.bitwise_and(img, img, mask = mask)
Red = img - Orange
res = np.concatenate((Orange, Red), axis=1)
cv2.namedWindow('Result', cv2.WINDOW_NORMAL)
cv2.imshow('Result', res)
cv2.waitKey(0)
【讨论】:
可能会出现图像质量较差且红色部分不再那么红的情况,但在此之前您仍然可以很好地区分不同的部分。然后,当我尝试您的答案时,它并没有完全做到它应该做的事情。 @cedrik24 更通用的是解决方案越不准确,因此您可以为green channel
执行contrast adjustment 之前 otsu thresholding
,但是分离的质量不会很完美!以上是关于从橙色动态检测红色的阈值方法的主要内容,如果未能解决你的问题,请参考以下文章