图像直方图比较

时间:2015-02-28 13:14:26

标签: matlab image-processing computer-vision

我试图在两个RGB图像之间进行直方图图像比较,这两个RGB图像包括相同人物和非头部的头部,以查看它们之间的相关性。我这样做的原因是因为在使用HOG执行扫描以检查扫描窗口是否是头部之后,我现在尝试在随后的帧中跟踪相同的头部,并且我还想删除一些明显的误报。

我目前尝试了RGB和HSV直方图比较,并使用欧几里德距离来检查直方图之间的差异。以下是我写的代码:

%RGB histogram comparison

 %clear all;
img1 = imread('testImages/samehead_1.png');
img2 = imread('testImages/samehead_2.png');

img1 = rgb2hsv(img1);
img2 = rgb2hsv(img2);

%% calculate number of bins = root(pixels);
[rows, cols] = size(img1);
no_of_pixels = rows * cols;
%no_of_bins = floor(sqrt(no_of_pixels));
no_of_bins = 256;

%% obtain Histogram for each colour
% -----1st Image---------
rHist1 = imhist(img1(:,:,1), no_of_bins);
gHist1 = imhist(img1(:,:,2), no_of_bins);
bHist1 = imhist(img1(:,:,3), no_of_bins);

hFig = figure;
hold on;
h(1) = stem(1:256, rHist1);
h(2) = stem(1:256 + 1/3, gHist1);
h(3) = stem(1:256 + 2/3, bHist1);

set(h, 'marker', 'none')
set(h(1), 'color', [1 0 0])
set(h(2), 'color', [0 1 0])
set(h(3), 'color', [0 0 1])

hold off;

% -----2nd Image---------
rHist2 = imhist(img2(:,:,1), no_of_bins);
gHist2 = imhist(img2(:,:,2), no_of_bins);
bHist2 = imhist(img2(:,:,3), no_of_bins);

hFig = figure;
hold on;
h(1) = stem(1:256, rHist2);
h(2) = stem(1:256 + 1/3, gHist2);
h(3) = stem(1:256 + 2/3, bHist2);

set(h, 'marker', 'none')
set(h(1), 'color', [1 0 0])
set(h(2), 'color', [0 1 0])
set(h(3), 'color', [0 0 1])

%% concatenate values of a histogram in 3D matrix
% -----1st Image---------
M1(:,1) = rHist1;
M1(:,2) = gHist1;
M1(:,3) = bHist1;

% -----2nd Image---------
M2(:,1) = rHist2;
M2(:,2) = gHist2;
M2(:,3) = bHist2;

%% normalise Histogram
% -----1st Image---------
M1 = M1./no_of_pixels;
% -----2nd Image---------
M2 = M2./no_of_pixels;

%% Calculate Euclidean distance between the two histograms
E_distance = sqrt(sum((M2-M1).^2));

E_distance由一个包含3个距离的数组组成,这些距离指的是红色直方图差异,绿色和蓝色。

问题是:

  • 当我将非头部(例如一个袋子)的直方图与头部的直方图进行比较时,误差存在明显差异。所以这是可以接受的,可以帮助我消除误报。
  • 但是!当我试图检查这两个图像是否是同一个人的头部时,这种技术根本没有帮助,因为另一个人的头部比同一个人的头部的欧几里德距离更小。

有人可以向我解释我是否正确地做了这个,或者对我应该做什么有什么指导?

PS:我从本文(亲和力测量部分)得到了LAB直方图比较的想法:People Looking at each other

1 个答案:

答案 0 :(得分:1)

颜色直方图相似性可以作为通过检测进行跟踪的良好线索,但不要依赖它来消除人与人和非人之间所有可能匹配的歧义。

根据您的代码,您可以做一件事来改进比较:目前,您正在使用每通道直方图。这没有足够的辨别力,因为你不知道RGB组件何时共同发生(例如,你知道红色通道在64-96范围内的次数以及蓝色在32-64范围内的次数,但是当这些发生时不会同时)。要纠正此问题,您必须使用3D直方图,计算颜色的共同现象。对于每个通道8个分区的离散化,您的直方图将具有8 ^ 3 = 512个分区。

其他改进建议:

  1. 根据插值权重对相邻区间进行加权分配。这消除了由二进制量化引入的不连续性
  2. 将检测窗口分层分割成细胞(1个细胞,4个细胞,16个细胞等),每个细胞都有自己的直方图,其中连接不同水平和细胞的直方图。这样可以捕捉当地的颜色细节,比如衬衫的颜色,或者更本地的衬衫口袋/袖子。
  3. 使用地球移动器的距离(EMD)而不是欧几里德度量来比较直方图。这减少了颜色量化效果(直方图的差异由颜色空间距离而不是相等的权重加权),并且允许在检测窗口内的单元定位中出现一些错误。
  4. 使用其他提示进行跟踪。您会惊讶地发现,您的检测中的HoG描述符之间的相似性有助于消除匹配的歧义!