如何取2x2像素块的平均值?

时间:2015-04-08 15:08:11

标签: matlab image-processing

我有一个图像,我必须采用2x2像素的平均颜色。

获取2x2像素块的平均颜色,然后计算图像中颜色与可供我们使用的颜色之间的距离。

我不知道采用2x2像素块的平均值意味着什么。怎么解决这个问题?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用blockproc

处理图像的非重叠块
Im = imread('coins.png');                            %// example image

fun = @(block_struct) mean( block_struct.data(:) );  %// anonymous function to get average of a block
B = blockproc(Im,[2 2],fun);                         %// process 2 by 2  blocks
imshow(B,[]);                                        %// show resulting image

答案 1 :(得分:2)

我建议的另一种方法是使用colfilt'sliding'标志和mean的组合作为操作功能。 'distinct'标志是您实际需要使用的标志,但是如果您看到我和@eigenchris之间的对话,我们就无法使用它。尽管如此,eigenchris已经证明这比blockproc快300倍。

因此,假设您的图片存储在im中,您只需执行以下操作:

out = uint8(colfilt(im, [2 2], 'sliding', @mean));
out2 = out(1:2:end,1:2:end);

您需要对结果进行二次采样的原因是,当我们应用sliding选项时,您有一次重叠块处理图像。因为您需要不同的块,所以您只需要1/4的图像,因为您已将图像分解为2 x 2块。在一个2 x 2的块中,如果你做了滑动选项,你将得到三个不需要的其他结果,因此上面的二次采样消除了两倍,从而消除了产生结果的其他三个块。

请注意,您需要转换结果,因为输出的类型为double


继续我和eigenchris之间的讨论,你可以用规范imfilter替换colfilt来复制上面代码的第一行。在将两者结合在一起时,我设法在我的机器上获得了8倍的加速。因此:

out = imfilter(im, [0.25 0.25; 0.25 0.25], 'replicate');
out2 = out(1:2:end,1:2:end);

就加速而言,我将每个调用包装在一个匿名函数中,然后使用timeit来计算函数的时间:

>> f = @() uint8(colfilt(im, [2 2], 'sliding', @mean));
>> g = @() imfilter(im, [0.25 0.25; 0.25 0.25], 'replicate');
>> T = timeit(f);
>> T2 = timeit(g);
>> T/T2

ans = 

7.5421

正如您所看到的,加速度大约是colfilt的8倍......最有可能的原因是它在引擎盖下呼叫im2colcol2im

答案 2 :(得分:1)

使用循环:(另一种方法,仅供了解)

A = imread('cameraman.tif');

i = 1; j = 1;
[rows, cols] = size(A);
C(rows/2,cols/2) = 0;
for x = 1:2:rows
    for y = 1:2:cols
        block = [A(x,y),A(x+1,y),A(x,y+1),A(x+1,y+1)];
        C(i,j) = mean(block(:));
        j = j+1;
    end
    i = i+1;
    j = 1;
end
C = uint8(C);

figure;
imshow(A);                          %// show original image
figure;   
imshow(C);                          %// show resulting image