我有一个图像,我必须采用2x2像素的平均颜色。
获取2x2像素块的平均颜色,然后计算图像中颜色与可供我们使用的颜色之间的距离。
我不知道采用2x2像素块的平均值意味着什么。怎么解决这个问题?
谢谢。
答案 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倍......最有可能的原因是它在引擎盖下呼叫im2col
和col2im
。
答案 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