сравнивая два изображения с помощью гистограммы - PullRequest
6 голосов
/ 29 марта 2011

Я хочу найти гистограмму двух изображений и найти сходство, используя евклидово расстояние.Я пытаюсь использовать команду imhist, но она выдает следующую ошибку:

Error using ==> iptcheckinput
Function IMHIST expected its first input, I or X, to be two-dimensional.

мой код выглядит следующим образом:

% read two images
Im1 = imread('1.jpg');
Im2 = imread('2.jpg');

%  convert images to type double (range from from 0 to 1 instead of from 0 to 255)
Im1 = im2double(Im1);
Im2 = im2double(Im2);

% Calculate the Normalized Histogram of Image 1 and Image 2
hn1 = imhist(Im1)./numel(Im1);
hn2 = imhist(Im2)./numel(Im2);

% Calculate the histogram error
f = sum((hn1 - hn2).^2);
f; %display the result to console

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

Действительно, гистограммы предназначены для представления перераспределения тональных значений для одного канала. Цветные изображения часто представляют собой 3-канальные изображения (красный, зеленый, синий в большинстве случаев).

Метод Гауля должен работать совершенно корректно. Если вы хотите быть более точным, вы можете извлечь каждый канал и вычислить его гистограмму:

Red1 = Im1(:, :, 1);
Green1 = Im1(:, :, 2);
Blue1 = Im1(:, :, 3);
HnBlue1 = imhist(Blue1)./numel(Blue1);

Теперь вы можете определить оценочную функцию на основе 3 евклидовых расстояний (1 для каждого канала):

FBlue = sum((HnBlue1 - HnBlue2).^2);
FRed= sum((HnRed1 - HnRed2).^2);
...
F = Alpha*FBlue + Beta*FRed + Gamma*FGreen //as an example

Поэтому вы можете сделать акцент на одном или другом цвете в определении расстояния. Это может быть полезно, если изображение, которое вы хотите проверить, имеет определенный цвет.

Это альтернатива методу Гаула, но его эквивалентом было бы установить Alpha, Beta и Gamma как "0.2989 * R + 0.5870 * G + 0.1140 * B", как заявил Андрей.

5 голосов
/ 29 марта 2011

Я предполагаю, что ваши изображения являются цветными изображениями, то есть имеют три канала. Чтобы уменьшить их до одного канала, изображения серой шкалы делают

Im1 = rgb2gray(Im1);
Im2 = rgb2gray(Im2);

hn1 = imhist(Im1)./numel(Im1);
hn2 = imhist(Im2)./numel(Im2);

и т.д ..

В качестве альтернативы, если вы хотите работать со всеми цветовыми каналами, вы можете растянуть изображения до векторов перед выполнением imhist, то есть просто выполните

hn1 = imhist(Im1(:))./numel(Im1);
hn2 = imhist(Im2(:))./numel(Im2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...