我有一个M×N图像,应该被分成[3 3]
的非重叠块。对于每个块,我应该制作渐变向量,使用mean
并最终进行标准化。
我已将图片调整为[3 3]
的可分割尺寸并使用blockproc
,但是当我测试时
fun = @(block_struct) mean2(block_struct.data);
A = blockproc(im,[3 3],fun);
我看到该块未应用于整个图像,而是应用于图像的左上角。
注意:块数未知。
[x,y]=size(im)
r=floor(x/3)
c=floor(y/3)
ext_x = mod(x,3);
ext_y = mod(y,3);
a = im(1:(end-ext_x), 1:(end-ext_y));
f= @(block_struct) gradient(block_struct.blockSize);
b=blockproc(im,[3,3],f);
imshow(b)
有什么想法吗?
答案 0 :(得分:1)
你知道如果你imshow(A)
,显示的图像尺寸将比im
的尺寸小3倍吗?那是因为mean2
当然会将每个3×3的块减少到一个标量......
除了显而易见的,我不认为你正在做的事情有什么不妥。我也无法重现你所说的话。
作为部分解决方案:请记住,MATLAB的许多功能都可以让普通用户尽可能轻松地生活。它们通常不非常复杂,只需要耗费一些时间。
将你自己的基本blockproc
:
%// Some bogus data
A = reshape(1:16, 4, 4);
%// Desired blocksize
blockSize = [2 2];
%// The desired function
fcn = @(x) mean2(gradient(x));
%// "blockproc"
m = 1;
blocks = size(A)./blockSize;
out = cell(blocks);
for jj = 1:blocks(2)
for ii = 1:blocks(1)
% The indices to the current block
blockIndsX = (1:blockSize(1)) + (ii-1)*blocks(1);
blockIndsY = (1:blockSize(2)) + (jj-1)*blocks(2);
%// Apply the function to the current block and store the result
out{m} = fcn( A(blockIndsX, blockIndsY, :) );
%// the index to the next output value
m = m + 1;
end
end
%// Make outcomes more intuitive; if every entry is a scalar, make the result a matrix
if all(cellfun(@isscalar, out(:)))
out = reshape([out{:}], size(out)); end
答案 1 :(得分:0)
您可以使用im2col
命令
你可以在这里看到它的用法: