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

Detect Color of particular area of Image Nodejs OpenCV

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

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

我想用 javascript 来做这个,但我也可以用 python OpenCV 来得到结果。 任何人都可以帮助我分享任何有用的东西 link 或者可以解释我怎样才能检测图像中特定区域的颜色。

例如。

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

我尝试过的:

我尝试过 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]))

效果很好,从图像中提取颜色区域但是如果图像有特定颜色,是否有任何回调响应以便自动完成?

@Prateek ...很高兴将问题缩小到核心。您提供的代码没有解决手头的这个问题,仍然只是一个问题。我会向您提示一个方向,但您必须自己编写代码。

steps that guide you towards a scripting result:

1) In your script add two (past & current) pixellists to store values (pixeltype + occurance).

2) Introduce a while-loop with an action true/stop statement (link to "3") for looping purpose because then it becomes a dynamic process.

3) Write a GUI with a flashy warning banner.

4) compare the pixellist with current_pixellist for serious state change (threshhold).

5) If the delta state change at "4" meets threshold throw the alert ("3").

当您编写完代码并享受跟踪回溯的麻烦时...然后编辑您的问题,用代码更新它并重塑您的问题(如果您愿意,我可以提供帮助)。然后我们可以从那里拿起它。这听起来像是一个计划吗?

所以我在这里假设,您已经知道 rect 的位置,它将被动态更改,并且需要找出所需颜色中最主要的颜色投资回报率。有很多方法可以做到这一点,一种是获取 ROI 中所有像素的平均值,另一种是计算给定 ROI 中所有不同的像素值,有一些容差差异。

方法一:

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)

方法二:

要找出给定图像中的各种主要聚类,您可以使用 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]

我不确定你为什么在这种情况下需要回调,但也许这就是你的意思?

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

解释:

    当像素在 (lower, upper) 范围内时,
  • cv2.inRange() 将 return 255,否则为 0(参见 docs
  • 使用np.any()检查mask中的任何元素是否实际上是255