Определите пропорцию определенных цветов в изображении - PullRequest
0 голосов
/ 18 января 2019

Есть ли у вас какие-либо идеи, как определить пропорции желтого (или желтоватого), коричневого и красного цветов в конкретном изображении? Я пытался использовать HSV, но не смог найти пороговое значение для H, S и V для вышеупомянутых цветов.

Я приложил образец изображения.

1 Ответ

0 голосов
/ 18 января 2019

Итак, давайте сделаем это один шаг за раз.

Во-первых, как узнать, какой цвет представлен каким значением? Для этого я сослался на вопрос stackoverflow , откуда вы можете получить эту цветовую карту HSV,

enter image description here

Если вы DuckDuckGo / Google / ищете для "HSV или HSL color map" , вы можете найти множество примеров.

  • Теперь мы можем выбрать цвет вдоль горизонтальной оси. Мы можем использовать одно значение, например 120 для темно-синего цвета или мы можем использовать диапазон значений, например 45 to 80 для всех оттенков зеленого.

  • В чем я не был уверен, так это как определить,

доля желтого (или желтоватого), коричневого и красного цветов в определенном изображении

как вы спросите в своем вопросе.

Я подумал о двух способах представления цветовой пропорции.

  1. Доля пикселей, содержащих некоторую часть этого оттенка.
  2. Доля определенного оттенка относительно всех оттенков на изображении.

Затем, используя следующий скрипт, вы можете получить несколько чисел:

ПРИМЕЧАНИЕ: (Этот скрипт на 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 на оси оттенка кажется розоватым) enter image description here

MASK2 (1 ~ 20 на оси оттенка кажется оранжевым) enter image description here

RES1

enter image description here

RES2

enter image description here

Вот эквивалентный 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...