从橙色动态检测红色的阈值方法

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】:

如果您有干净的图像,例如提供的没有嘈杂背景的图像,并且您想要区分 RedOrange 的颜色,即 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,但是分离的质量不会很完美!

以上是关于从橙色动态检测红色的阈值方法的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:为颜色过滤选择 HSV 阈值

从相机设备获取号码

从 sql 中动态选择阈值

你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是不是超过特定数量的阈值? [复制]

在Python中实现阈值检测功能

峰值查找算法 - 动态阈值或替代方法