使用遮罩的OpenCV最大和最小RGB值

4

我需要获取圆形的最小RGB值。如何像平均RGB值方法(cv2.mean)应用掩码一样操作?为了获取圆形的平均RGB值,我正在执行以下操作:

circle_img = np.zeros((circle_img.shape[0],circle_img.shape[1]), np.uint8)
cv2.circle(circle_img,(x_center,y_center),radio,(255,255,255),-1)
datos_rgb = cv2.mean(color_img, mask=circle_img)

在这里,color_img 是原始图像。

要获取最小的RGB值,我正在执行以下操作:

masked_data = cv2.bitwise_and(color_img, color_img, mask=circle_img)
rgb_min = masked_data.reshape((masked_data.shape[0]*masked_data.shape[1], 3)).min(axis=0)

masked_data是第二个图片(遮罩圆)时。

但由于背景,我一直得到[0,0,0]这个值...我需要像平均值(cv2.mean)一样应用掩码来忽略黑色背景。原始图像中没有纯黑色,因此无法获得值[0,0,0]。

要获取最大的RGB值,可以通过以下方式完美运作:

masked_data = cv2.bitwise_and(color_img, color_img, mask=circle_img)
rgb_max = masked_data.reshape((masked_data.shape[0]*masked_data.shape[1], 3)).max(axis=0)

因为黑色[0,0,0]在此处不起作用。

这是原始图像。

Masked circle

这是遮罩圆形图像。 Original image

1个回答

4
你可以尝试仅使用numpy方法来获取所有所需计算的结果,而不是在某些情况下使用OpenCV和在其他情况下使用numpy。在某些情况下,numpy的执行时间可能会优于OpenCV。您可以使用numpys' min, maxmean 来实现:
import cv2
import numpy as np

img = cv2.imread("./assets/11yeJ.jpg")
mask = np.zeros((img.shape[0],img.shape[1]), np.uint8)
cv2.circle(mask, (493, 338), 30, (255, 255, 255), -1)

# Get the indices of mask where value == 255, which may be later used to slice the array.
img_mask = img[np.where(mask == 255)]

img_avg = np.mean(img_mask, axis=0)
img_min = np.min(img_mask, axis=0)
img_max = np.max(img_mask, axis=0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接