使用immaximas查找图像中最常见的颜色块?

时间:2017-09-09 03:52:53

标签: matlab octave

我想在图像上应用64x64滑动窗口,并在该窗口中输出最常见的颜色。 immaximas会成为我想要的吗?或者这个函数会给我颜色块的位置吗?

我的启发式示例:

pkg load image;
pkg load signal;

i = imread('foo.jpg');

[r,c] = immaximas(i, 65);  % radius=65 ie a 65x65 kernel correct?
% I should now know the most common colour in 65x6 regions across the image right?

1 个答案:

答案 0 :(得分:1)

来自immaximas文档。

  

查找局部空间最大值。

     

...

     

局部空间最大值被定义为具有值的图像点   比宽度的正方形区域中的所有相邻值大   2 *半径+ 1

所以immaximas与查找最常见的值无关。

数字列表中最常见的元素称为模式。如果您只想在图像中的每个点输出最常用的颜色,可以使用图像处理工具箱中的nlfilter

imode = nlfilter(i, [64 64], 'sliding', @mode);

如果图像是3通道,类型为uint8,您可以将像素编码为单个值,然后找到模式。此外,忽略边缘上的隐式零填充是很好的,因此我们将1加到编码值中,并找到只有非零值的模式。

i = uint32(imread('peppers.png'));

% encode 3 channel image into single channel
ienc = 1+bitor(bitor(i(:,:,1), bitshift(i(:,:,2),8)), bitshift(i(:,:,3),16));

% find the mode
imode = nlfilter(ienc, [64 64], @(x) mode(x(x~=0)));

% decode single into 3 channel image
idec = zeros(size(i));
idec(:,:,1) = bitand(uint32(255), imode(:,:,1)-1);
idec(:,:,2) = bitshift(bitand(uint32(65280), imode(:,:,1)-1),-8);
idec(:,:,3) = bitshift(bitand(uint32(16711680), imode(:,:,1)-1),-16);
idec = uint8(idec);

imshow(uint8(idec));

<强>结果

enter image description here

enter image description here