1. 程式人生 > >顏色矩的特徵提取

顏色矩的特徵提取



 轉載於

顏色特徵是一種全域性特徵,描述了影象或影象區域所對應的景物的表面性質.一般顏色特徵是基於畫素點的特徵,此時所有屬於影象或影象區域的畫素都有各自的貢獻.由於顏色對影象或影象區域的方向、大小等變化不敏感,所以顏色特徵不能很好地捕捉影象中物件的區域性特徵.另外,僅使用顏色特徵查詢時,如果資料庫很大,常會將許多不需要的影象也檢索出來.顏色直方圖是最常用的表達顏色特徵的方法,其優點是不受影象旋轉和平移變化的影響,進一步藉助歸一化還可不受影象尺度變化的影響,基缺點是沒有表達出顏色空間分佈的資訊.

(顏色直方圖):

       A color histogram of an image represents the distribution of the composition of colors in the image. It shows different types of colors appeared and the number of pixels in each type of the colors appeared. The relation between a color histogram and a luminance histogram is that a color histogram can be also expressed as “Three Color Histograms”, each of which shows the brightness distribution of each individual Red/Green/Blue color channel.

      使用最多的可能就是灰度直方圖,而它丟失了很多顏色資訊,所以努力實現顏色直方圖,它能夠直接代表實際圖中的顏色的數量。

MATLAB實現:

  [plain] view plain copy print?
  1. function createColorHistograms(im_str)  
  2. if ~isstr(im_str)  
  3.     if ndims(im_str)==3  
  4.         try  
  5.             col_array_vals=double(im_str);  
  6.         catch  
  7.             disp('Input is not a valid three-dimensional array');  
  8.             return;  
  9.         end  
  10.     end  
  11. else  
  12.     try  
  13.         col_array_vals=double(imread(im_str));  
  14.         if ndims(col_array_vals)~=3  
  15.             disp('Input is not a valid three-dimensional array');  
  16.             return;  
  17.         end  
  18.     catch  
  19.         disp('Input string does not point to a valid image file');  
  20.         return;  
  21.     end  
  22. end  
  23. res_val=90;  
  24. t_count=res_val*floor(col_array_vals(:,:,1)/res_val)+256*(res_val*floor(col_array_vals(:,:,2)/res_val))+256*256*(res_val*floor(col_array_vals(:,:,3)/res_val));  
  25. t_count=sort(t_count(:));  
  26. [col_val,ind_first]=unique(t_count,'first');  
  27. [col_val,ind_last]=unique(t_count,'last');  
  28. disp('Drawing color bars')  
  29. disp('Drawing image')  
  30. subplot(121);  
  31. set(gcf,'position',[5   61   274   236]);  
  32. imshow(col_array_vals/255)  
  33. colorbars(col_val,ind_last-ind_first,1/3,1/4)  
  34. function colorbars(triplet_color,triplet_freq,varargin)  
  35. if nargin==2  
  36.     color_pow=1/3;  
  37.     freq_pow=1/4;  
  38. else  
  39.     color_pow=varargin{1};  
  40.     freq_pow=varargin{2};  
  41. end  
  42. N_rand=randperm(length(triplet_freq));  
  43. triplet_freq=sqrt(triplet_freq(N_rand));  
  44. triplet_color=triplet_color(N_rand);  
  45. triplet_color=([rem(triplet_color,256) floor(rem(triplet_color,256*256)/255) floor(triplet_color/(256*256))]/255);  
  46. triplet_color_norm=triplet_color./repmat(((sum(triplet_color.^(1),2))+.005),1,3);  
  47. max(triplet_color_norm)  
  48. triplet_diff=sum(abs(triplet_color_norm-repmat(triplet_color_norm(end,:),size(triplet_color_norm,1),1)),2);  
  49. triplet_diff=sum(abs(triplet_color_norm-repmat([.9 0 0],size(triplet_color_norm,1),1)),2);  
  50. max(triplet_diff)  
  51. triplet_diff=(triplet_diff/max(triplet_diff).^(color_pow))+(triplet_freq*0).^(freq_pow);  
  52. [d,inds_sort]=sort(triplet_diff);  
  53. triplet_freq=(triplet_freq(inds_sort));  
  54. triplet_color=(triplet_color(inds_sort,:));  
  55. num_bars=length(triplet_color);  
  56. max_val=max(triplet_freq);  
  57. % close all;  
  58. subplot(122);  
  59. axis([0 num_bars 0 1]);  
  60. %%   
  61.     [~,ind] = max(triplet_freq);  
  62.     triplet_color(ind,:)=[];  
  63.     triplet_freq(ind,:)=[];  
  64.     num_bars = num_bars-1;  
  65. %%     
  66. for i=1:num_bars  
  67.     tempColor=min(triplet_color(i,:),.9);  
  68.     %===  
  69.     % Use patch to draw individual bars  
  70.     %===  
  71.     patch([i-1 i-1 i i],...  
  72.         [0 triplet_freq(i)/max_val triplet_freq(i)/max_val 0],...  
  73.         tempColor,...  
  74.         'edgecolor',...  
  75.         tempColor);  
  76. end  
  77. % colorbar('LineWidth',1);  
  78. set(gca,'xtick',[0:10:255])  
  79. set(gca,'ytick',[0:0.05:1])  
  80. set(gcf,'position',[5 378 560 420]);  
  81. set(gca,'visible','on')  
  82. function y_val=sigmoidVal(x_val,varargin)  
  83. if nargin==1  
  84.     multip_val=15;  
  85. else  
  86.     multip_val=varargin{1};  
  87. end  
  88. y_val=1./(1+exp(-(x_val-.5)*multip_val));  
function createColorHistograms(im_str)

if ~isstr(im_str)
    if ndims(im_str)==3
        try
            col_array_vals=double(im_str);
        catch
            disp('Input is not a valid three-dimensional array');
            return;
        end
    end
else
    try
        col_array_vals=double(imread(im_str));
        if ndims(col_array_vals)~=3
            disp('Input is not a valid three-dimensional array');
            return;
        end

    catch
        disp('Input string does not point to a valid image file');
        return;
    end
end

res_val=90;

t_count=res_val*floor(col_array_vals(:,:,1)/res_val)+256*(res_val*floor(col_array_vals(:,:,2)/res_val))+256*256*(res_val*floor(col_array_vals(:,:,3)/res_val));
t_count=sort(t_count(:));

[col_val,ind_first]=unique(t_count,'first');
[col_val,ind_last]=unique(t_count,'last');
disp('Drawing color bars')

disp('Drawing image')
subplot(121);
set(gcf,'position',[5   61   274   236]);
imshow(col_array_vals/255)
colorbars(col_val,ind_last-ind_first,1/3,1/4)


function colorbars(triplet_color,triplet_freq,varargin)

if nargin==2
    color_pow=1/3;
    freq_pow=1/4;
else
    color_pow=varargin{1};
    freq_pow=varargin{2};
end

N_rand=randperm(length(triplet_freq));
triplet_freq=sqrt(triplet_freq(N_rand));
triplet_color=triplet_color(N_rand);

triplet_color=([rem(triplet_color,256) floor(rem(triplet_color,256*256)/255) floor(triplet_color/(256*256))]/255);
triplet_color_norm=triplet_color./repmat(((sum(triplet_color.^(1),2))+.005),1,3);
max(triplet_color_norm)
triplet_diff=sum(abs(triplet_color_norm-repmat(triplet_color_norm(end,:),size(triplet_color_norm,1),1)),2);

triplet_diff=sum(abs(triplet_color_norm-repmat([.9 0 0],size(triplet_color_norm,1),1)),2);

max(triplet_diff)

triplet_diff=(triplet_diff/max(triplet_diff).^(color_pow))+(triplet_freq*0).^(freq_pow);



[d,inds_sort]=sort(triplet_diff);
triplet_freq=(triplet_freq(inds_sort));
triplet_color=(triplet_color(inds_sort,:));

num_bars=length(triplet_color);
max_val=max(triplet_freq);
% close all;
subplot(122);
axis([0 num_bars 0 1]);
%% 
    [~,ind] = max(triplet_freq);
    triplet_color(ind,:)=[];
    triplet_freq(ind,:)=[];
    num_bars = num_bars-1;
%%   
for i=1:num_bars
    tempColor=min(triplet_color(i,:),.9);
    %===
    % Use patch to draw individual bars
    %===
    patch([i-1 i-1 i i],...
        [0 triplet_freq(i)/max_val triplet_freq(i)/max_val 0],...
        tempColor,...
        'edgecolor',...
        tempColor);
    
end
% colorbar('LineWidth',1);

set(gca,'xtick',[0:10:255])
set(gca,'ytick',[0:0.05:1])
set(gcf,'position',[5 378 560 420]);
set(gca,'visible','on')

function y_val=sigmoidVal(x_val,varargin)

if nargin==1
    multip_val=15;
else
    multip_val=varargin{1};
end

y_val=1./(1+exp(-(x_val-.5)*multip_val));