检测Image Nodejs OpenCV特定区域的颜色

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

到目前为止我遇到过使用OpenCV,我们可以做到这一点,但还没有find任何特定的教程来帮助这一点。

我想用JavaScript做到这一点,但我也可以使用python OpenCV来获得结果。 任何人都可以帮助我分享任何有用的链接,或者可以解释如何实现检测图像中特定区域的颜色。

例如。 在这里输入图像描述

红框表示不同的颜色。 我需要弄清楚它显示的是哪种颜色。

我曾经尝试过:

我已经尝试过OpenCV Canny图像,虽然我成功地将Canny图像与区域分离,但是如何检测特定Canny区域的颜色仍然是一个挑战。

另外,我用OpenCV中的inRange方法尝试了这个方法,这个方法非常完美

# find the colors within the specified boundaries and apply # the mask mask = cv2.inRange(image, lower, upper) output = cv2.bitwise_and(image, image, mask = mask) # show the images cv2.imshow("images", np.hstack([image, output])) 

它运作良好,从图像中提取颜色区域但是有没有回应,如果图像具有特定的颜色,以便它可以自动完成回应?

所以我在这里假设你已经知道矩形的位置将被dynamic地改变,并且需要找出期望的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] 

@Prateek ……很高兴把这个问题缩小到核心。 您提供的代码不能解决这个问题,只是一个问题。 我会告诉你一个方向,但你必须自己编码。

这些步骤可以引导您使用脚本结果:

1)在你的脚本中添加两个(过去和当前)像素单元来存储值(pixeltype +发生)。

2)为循环目的引入一个带有true / stop语句的动作循环(链接到“3”),因为它成为一个dynamic的过程。

3)写一个华丽的警告横幅GUI。

4)比较pixellist与current_pixellist严重的状态变化(threshhold)。

5)如果在“4”处的增量状态变化达到阈值,则抛出警报(“3”)。

当你编写代码,并且喜欢跟踪回溯的麻烦…然后编辑你的问题,用代码更新它,并重塑你的问题(如果你愿意的话,我可以帮助你)。 那我们可以从那里拿起来 这听起来像一个计划吗?

我不知道为什么你需要在这种情况下callback,但也许这是你的意思?

 def test_color(image, lower, upper): mask = cv2.inRange(image, lower, upper) return np.any(mask == 255) 

说明:

  • 当像素在范围内时, cv2.inRange()将返回255 (lower, upper) ,否则为0(请参阅文档 )
  • 使用np.any()检查mask 任何元素是否实际上是255