Перво-наперво, у вашего кода есть пара проблем:
- Ваш ROI (
rect
) больше, чем изображение, и только первые 7 строк используются в качестве фона. Возможно, вы захотите определить более точную рентабельность инвестиций или использовать вместо этого режим GC_EVAL
Вы извлекаете передний план вместо фона в:
mask = np.where((mask == 3) | (mask == 1), 0, 1).astype('uint8')
img = img*mask[:, :, np.newaxis]
Вас интересует цвет изображения, но вы загружаете изображение как черно-белое в
resim = cv2.imread("histogram.jpg", 0)
Поскольку вас действительно интересует только насыщенность (то есть количество «цветов» в пикселях), вам следует преобразовать ваше изображение из цветового пространства BGR в пространство HSV и создать гистограмму канала насыщения. На самом деле вам, вероятно, не нужна гистограмма, и вы можете использовать простой порог:
img = img*mask[:, :, np.newaxis]
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
saturation_threshold = 20 # try different thresholds to see which value works for you
ratio = numpy.count_nonzero(hsv[:,:,1] > saturation_threshold ) / numpy.count_nonzero(mask)
ratio
будет количеством пикселей, которые не являются оттенками серого