Итак, давайте сделаем это один шаг за раз.
Во-первых, как узнать, какой цвет представлен каким значением? Для этого я сослался на вопрос stackoverflow , откуда вы можете получить эту цветовую карту HSV,
Если вы DuckDuckGo / Google / ищете для "HSV или HSL color map" , вы можете найти множество примеров.
Теперь мы можем выбрать цвет вдоль горизонтальной оси. Мы можем использовать одно значение, например 120
для темно-синего цвета или мы можем использовать диапазон значений, например 45 to 80
для всех оттенков зеленого.
В чем я не был уверен, так это как определить,
доля желтого (или желтоватого), коричневого и красного цветов в определенном изображении
как вы спросите в своем вопросе.
Я подумал о двух способах представления цветовой пропорции.
- Доля пикселей, содержащих некоторую часть этого оттенка.
- Доля определенного оттенка относительно всех оттенков на изображении.
Затем, используя следующий скрипт, вы можете получить несколько чисел:
ПРИМЕЧАНИЕ: (Этот скрипт на Python, который я первоначально разместил. Соответствующий скрипт на Matlab находится дальше от поста.)
import cv2
import numpy as np
img = cv2.imread("D:\\lenna.jpg")
height_img, width_img, channels_img = img.shape
# Converts images from RGB to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask1 = cv2.inRange(hsv, (150, 0, 0), (150, 255,255)) #150 seems like pinkish
mask2 = cv2.inRange(hsv, (1,0,0), (20, 255, 255)) #1 to 20 seems orangish
total_num_of_pixels = height_img * width_img
all_colors = np.sum(hsv[:,:,:] > 0)
num_of_pixels_with_pinkish_component = np.sum(mask1 > 0)
num_of_pixels_with_orangish_component = np.sum(mask2 > 0)
print("%age of pixels with pinkish component:", "{:.2f}".format(num_of_pixels_with_pinkish_component/total_num_of_pixels * 100))
print("%age of pixels with orangish component:", "{:.2f}".format(num_of_pixels_with_orangish_component/total_num_of_pixels * 100))
print("%age of pinkish component in the entire HSV image:", "{:.2f}".format(num_of_pixels_with_pinkish_component/all_colors * 100))
print("%age of orangish in the entire HSV image:", "{:.2f}".format(num_of_pixels_with_orangish_component/all_colors * 100))
# To visualize the results
res1 = cv2.bitwise_and(img, img, mask=mask1)
res2 = cv2.bitwise_and(img, img, mask=mask2)
cv2.imshow('img', img)
cv2.imshow('mask1', mask1)
cv2.imshow('mask2', mask2)
cv2.imshow('res1', res1)
cv2.imshow('res2', res2)
# To save the output
cv2.imwrite('D:\\mask1.png', mask1)
cv2.imwrite('D:\\mask2.png', mask2)
cv2.imwrite('D:\\res1.png', res1)
cv2.imwrite('D:\\res2.png', res2)
% возраст пикселей с розоватым компонентом: 0,41
% возраст пикселей с оранжевой составляющей: 35,58
% возраст розоватого компонента во всем изображении ВПГ: 0,15
% возраста оранжевого на всем изображении ВПГ: 13,27
- Вот как выглядит результат:
MASK1 (150 на оси оттенка кажется розоватым)
MASK2 (1 ~ 20 на оси оттенка кажется оранжевым)
RES1
RES2
Вот эквивалентный MATLAB скрипт.
close all;
clear all;
clc;
img = imread("/home/junglefox/Downloads/lenna.png");
figure, imshow(img), title('original image (RGB)');
img_size = size(img);
hsv_img = rgb2hsv(img);
hsv_img = im2uint8(hsv_img);
figure, imshow(hsv_img), title('original image in HSV');
% Orange component between 1 and 20 on the HSV map
minval = [1 0 0]; %// Define three element vector here for each colour plane i.e. [0 128 128];
maxval = [20 255 255]; %// Define three element vector here for each colour plane i.e. [0 128 128];
out = true(img_size(1), img_size(2));
for p = 1 : 3
out = out & (hsv_img(:,:,p) >= minval(p) & hsv_img(:,:,p) <= maxval(p));
end
figure, imshow(out), title('image of orange component in image only');
total_num_of_pixels = img_size(1) * img_size(2);
all_colors = sum(hsv_img(:,:,:) > 0);
num_of_pixels_with_orangish_component = sum(sum(out > 0));
percentage_orange = num_of_pixels_with_orangish_component/total_num_of_pixels * 100;
printf("percentage of orange component in all pixels:%d\n", percentage_orange);