检测 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
我正在尝试编写代码来检测图像特定区域的颜色。
到目前为止我遇到的是使用 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)
解释:
-
当像素在
cv2.inRange()
将 return 255,否则为 0(参见 docs)- 使用
np.any()
检查mask
中的任何元素是否实际上是255
(lower, upper)
范围内时,