我正在尝试编写代码来检测图像特定区域的颜色。
到目前为止,我遇到的是使用OpenCV,我们可以这样做,但仍然没有找到任何特定的教程来帮助解决这个问题。
我想用javascript做这个,但我也可以使用python OpenCV来获得结果。 谁能帮助我分享任何有用的链接,或者可以解释如何检测图像中特定区域的颜色。
红色框会显示不同的颜色。我需要弄清楚它呈现的颜色。
我尝试过:
我尝试过OpenCV canny图像,虽然我成功地用canny图像分隔了区域,如何检测特定canny区域的颜色仍然是一个挑战。
另外,我尝试使用OpenCV中的inRange方法,它完美无缺
unpublished_content_type
效果很好并从图像中提取颜色区域但是,如果图像具有特定的颜色,是否可以自动完成所有回调?
答案 0 :(得分:1)
所以我在这里假设,你已经知道了 rect 的位置,它将动态地改变,并且需要在所需的ROI中找出单个最主要的颜色。有很多方法可以做同样的事情,一个是获得ROI中所有像素的平均值,另一个是计算给定ROI中的所有不同像素值,并有一些容差。
方法1:
import cv2
import numpy as np
img = cv2.imread("path/to/img.jpg")
region_of_interest = (356, 88, 495, 227) # left, top, bottom, right
cropped_img = img[region_of_interest[1]:region_of_interest[3], region_of_interest[0]:region_of_interest[2]]
print cv2.mean(cropped_img)
>>> (53.430516018839604, 41.05708814243569, 244.54991977640907, 0.0)
方法2:
要查找给定图像中的各种主要群集,您可以使用cv2.kmeans()
作为:
import cv2
import numpy as np
img = cv2.imread("path/to/img.jpg")
region_of_interest = (356, 88, 495, 227)
cropped_img = img[region_of_interest[1]:region_of_interest[3], region_of_interest[0]:region_of_interest[2]]
Z = cropped_img.reshape((-1, 3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 4
ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# Sort all the colors, as per their frequencies, as:
print center[sorted(range(K), key=lambda x: np.count_nonzero(label == [x]), reverse=True)[0]]
>>> [ 52.96525192 40.93861389 245.02325439]
答案 1 :(得分:0)
@Prateek ...很高兴将问题缩小到核心。您提供的代码并未解决此问题,仍然只是一个问题。我会向你暗示一个方向,但你必须自己编码。
指导您编写脚本结果的步骤:
1)在你的脚本中添加两个(过去和当前)pixellists来存储值(pixeltype + occurrence)。
2)引入一个带有动作true / stop语句的while循环(链接到“3”)以进行循环,因为它变成了一个动态过程。
3)使用华丽的警告标语编写GUI。
4)将pixellist与current_pixellist进行比较以进行严重的状态变化(阈值)。
5)如果“4”处的增量状态变化达到阈值则抛出警报(“3”)。
当你编写代码并且喜欢跟踪追溯时遇到的麻烦...然后编辑你的问题,用代码更新它并重塑你的问题(如果你愿意,我可以提供帮助)。然后我们可以从那里拿起它。这听起来像是一个计划吗?
答案 2 :(得分:0)
我不确定为什么在这种情况下你需要回调,但也许这就是你的意思?
def test_color(image, lower, upper):
mask = cv2.inRange(image, lower, upper)
return np.any(mask == 255)
说明:
cv2.inRange()
内时,(lower, upper)
将返回255,否则返回0(请参阅docs)np.any()
检查mask
中的任何元素是否实际为255