【问题标题】:Image Histogram Comparison图像直方图比较
【发布时间】:2015-05-01 04:06:14
【问题描述】:

我试图在包括同一个人的头部和非头部的两个 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

【问题讨论】:

  • 直方图比较对于这类任务不是很有效。例如,同一个人在不同的照明条件下会比在与比较图像类似的照明条件下的潜在不同的人提供更大的距离。
  • 我明白...那么对于边界框亲和性,您有什么建议? IE。您如何将检测到的单独窗口关联在一起?谢谢
  • 好吧,既然您希望能够匹配人脸,我会建议更符合人脸识别的技术。提取该域中使用的描述符并进行比较。
  • 正如我试图在问题中解释的那样......我已经使用 HOG + SVM 执行了检测部分。所以目前我处于后期处理阶段......即我正在尝试修剪误报,并尝试将不同帧中检测到的窗口与同一个人关联以进行跟踪。
  • 我说的不是检测,而是识别。您可能可以从特征面开始,然后从那里开始。

标签: matlab image-processing computer-vision


【解决方案1】:

颜色直方图相似度可以用作通过检测进行跟踪的一个很好的线索,但不要指望它可以消除人与人之间和人与非人之间所有可能匹配的歧义。

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

其他改进建议:

  1. 根据插值权重对相邻 bin 进行加权分配。这消除了 bin 量化引入的不连续性
  2. 将检测窗口分层拆分为单元格(1 个单元格、4 个单元格、16 个单元格等),每个单元格都有自己的直方图,其中连接了不同级别和单元格的直方图。这样可以捕捉当地的颜色细节,例如衬衫的颜色,甚至更本地的颜色,衬衫口袋/袖子。
  3. 使用地球移动距离 (EMD) 而不是欧几里得度量来比较直方图。这减少了颜色量化效应(直方图中的差异通过颜色空间距离而不是相等的权重进行加权),并允许在检测窗口内定位细胞时出现一些错误。
  4. 使用其他线索进行跟踪。您会惊讶地发现,检测的 HoG 描述符之间的相似性在多大程度上有助于消除匹配的歧义!

【讨论】:

  • 亲爱的@Killogre,关于这个声明:“要纠正这个问题,你必须使用 3D 直方图,计算颜色的共同出现)。”你能否进一步解释一下如何请问我可以数一下颜色的共现吗?
  • 请问您推荐的每个频道的 bin 数量是多少?根据维基百科,一种选择是像素数的平方根。但我认为这些垃圾箱的数量太多了。
  • 我的意思是你必须检查像素,查看它们的 RGB(或 HSV)值,并为每个三元组计算正确的 bin。每个通道有 8 个 bin(推荐),bin 索引将为 64*(r/32)+8*(g/32)+b/32。请注意,这些是整数除法。最简单的直方图只是增加了这个 bin 的计数。
  • 谢谢 :) 关于第 4 点。您的意思是我根据 HOG 特征向量生成直方图(比如使用 10 个 bin)并通过欧几里得距离比较直方图?感谢您的大力协助。
  • 让我纠正一下自己...抱歉 HOG 本身已经是一个特征向量...所以我只需要使用欧几里得距离比较两个 HOG 向量。请问我说的对吗?
猜你喜欢
  • 2013-10-13
  • 2016-09-19
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多