检测图像节点OpenCV的特定区域的颜色

时间:2017-11-16 16:12:47

标签: node.js opencv image-processing colors detection

我正在尝试编写代码来检测图像特定区域的颜色。

到目前为止,我遇到的是使用OpenCV,我们可以这样做,但仍然没有找到任何特定的教程来帮助解决这个问题。

我想用javascript做这个,但我也可以使用python OpenCV来获得结果。 谁能帮助我分享任何有用的链接,或者可以解释如何检测图像中特定区域的颜色。

例如。 enter image description here

红色框会显示不同的颜色。我需要弄清楚它呈现的颜色。

我尝试过:

我尝试过OpenCV canny图像,虽然我成功地用canny图像分隔了区域,如何检测特定canny区域的颜色仍然是一个挑战。

另外,我尝试使用OpenCV中的inRange方法,它完美无缺

unpublished_content_type

效果很好并从图像中提取颜色区域但是,如果图像具有特定的颜色,是否可以自动完成所有回调?

3 个答案:

答案 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