您编写的代码正在比较图像之间的直方图,前提是它们是灰度的。如果您想对 RGB 图像执行此操作,则需要确定每个平面需要多少个 bin。执行此操作后,对于您拥有的每个 RGB 颜色三元组,您将确定一个线性一维索引,这样它基本上就像正常的一维直方图一样。完成此操作后,您可以按照上面指定的相同方式使用上面的代码。因此,让我们创建一个函数imcolourhist
它接收图像以及您想要的红色、绿色和蓝色容器的总数。请记住,您can't指定每个维度 256 个 bin。这不仅太细化而没有任何歧视性的力量,而且你需要2^24 = 16777216
内存位置,MATLAB 肯定会给你一个内存不足的错误。
一般程序是确定每种颜色独立属于哪个容器。执行此操作后,您将创建一个线性一维索引,它本质上是一维直方图的容器,然后在该位置增加该值。我要使用accumarray http://www.mathworks.com/help/matlab/ref/accumarray.html为我计算直方图。一旦我们完成,这将基本上取代您的imhist
调用,您将在此输出的直方图上执行直方图交集imcolourhist
反而。
function [out] = imcolourhist(im, num_red_bins, num_green_bins, num_blue_bins)
im = double(im); %// To maintain precision
%// Compute total number of bins
total_bins = num_red_bins*num_green_bins*num_blue_bins;
%// Figure out threshold between bins
red_level = 256 / num_red_bins;
green_level = 256 / num_green_bins;
blue_level = 256 / num_blue_bins;
%// Calculate which bins for each colour plane
%// each pixel belongs to
im_red_levels = floor(im(:,:,1) / red_level);
im_green_levels = floor(im(:,:,2) / green_level);
im_blue_levels = floor(im(:,:,3) / blue_level);
%// Compute linear indices
ind = im_blue_levels*num_red_bins*num_green_bins + im_green_levels*num_red_bins + im_red_levels;
ind = ind(:); %// Make column vector for accumarray
%// Determine 1D histogram - Ensure that every histogram
%// generated has the same size of total_bins x 1
out = accumarray(ind+1, 1, [total_bins 1]);
end
获取此代码,将其复制并粘贴到新文件中,然后另存为imcolourhist.m
。确保将此代码保存在与您向我们展示的上述代码所在的同一目录中。请注意,在accumarray
,我将线性索引偏移 1,因为我生成的线性索引将从0
,但 MATLAB 开始索引1
。现在,您所要做的就是更换您的imhist
打电话给imcolourhist
。我建议您现在选择每个颜色通道的 bin 为 8(即num_red_bins = num_green_bins = num_blue_bins = 8
。您必须尝试一下才能获得良好的结果。
因此,您可以更改计算直方图的代码A
as:
Inp1=imread('D:\visionImages\c1\1.ppm');
num_red_bins = 8;
num_green_bins = 8;
num_blue_bins = 8;
num_bins = num_red_bins*num_green_bins*num_blue_bins;
A = imcolourhist(Inp1, num_red_bins, num_green_bins, num_blue_bins);
请注意,我在图像中读的是colour, 所以rgb2gray
呼叫已删除。同样,对于B
,你会这样做:
B = zeros(num_bins, 30);
ptr=1;
for i = 1 : length(srcFiles)
filename = strcat('D:\visionImages\c1\',srcFiles(i).name);
I = imread(filename);
B(:,ptr) = imcolourhist(I, num_red_bins, num_green_bins, num_blue_bins);
ptr=ptr+1;
end
请注意,我不能保证这里有好的结果。由于您仅使用颜色直方图作为图像检索方法,因此您可能拥有一个查询图像和一个数据库图像,它们可能具有相同的颜色分布,但在纹理和构图方面看起来完全不同。如果这两个图像具有相同的颜色分布,则它们将被视为高度相似,即使它们看起来彼此毫无相似之处。
祝你好运!