我想在图像上应用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?
答案 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));
<强>结果强>