MATLAB 2x2 maximum fill
1 次查看(过去 30 天)
显示 更早的评论
Hello guys ,
I have a problem.I have an image file and you also know it is matrix.I want to implement 2x2 maximum fill as an image that i upload. I want to search the all 2x2 pixels , finding the maximum value and fill 2x2 area (that we searched) with the maximum value.Can anyone help me. Thank you
0 个评论
采纳的回答
Stephen23
2017-3-11
编辑:Stephen23
2017-3-11
>> ipt = [128,25,12,26;240,200,15,25;128,128,255,15;35,35,35,155]
ipt =
128 25 12 26
240 200 15 25
128 128 255 15
35 35 35 155
>> blk = [2,2];
>> fun = @(s)max(s.data(:))*ones(blk);
>> otp = blockproc(ipt,blk,fun)
otp =
240 240 26 26
240 240 26 26
128 128 255 255
128 128 255 255
>> blk = [2,2];
>> spl = size(ipt)./blk;
>> col = repmat(blk(1),1,spl(1));
>> row = repmat(blk(2),1,spl(2));
>> C = mat2cell(ipt,col,row);
>> foo = @(m)max(m(:))*ones(blk);
>> otp = cell2mat(cellfun(foo,C,'Uni',0))
otp =
240 240 26 26
240 240 26 26
128 128 255 255
128 128 255 255
>> blk = [2,2];
>> idx = size(ipt)./blk;
>> idx = reshape(1:prod(idx),idx);
>> idx = kron(idx,ones(blk)); % (repelem also works)
>> vec = accumarray(idx(:),ipt(:),[],@max);
>> otp = vec(idx)
otp =
240 240 26 26
240 240 26 26
128 128 255 255
128 128 255 255
>> idx = size(ipt)./blk;
>> tmp = reshape(ipt,blk(1),idx(1),blk(2),idx(2));
>> tmp = permute(tmp,[2,4,1,3]);
>> tmp = max(max(tmp,[],4),[],3);
>> otp = kron(tmp,ones(blk))
otp =
240 240 26 26
240 240 26 26
128 128 255 255
128 128 255 255
3 个评论
Stephen23
2017-3-11
编辑:Stephen23
2017-3-11
This error occurs if the input matrix is not double. It can be fixed by specifying the class of the ones in fun:
>> ipt = uint8([128,25,12,26;240,200,15,25;128,128,255,15;35,35,35,155]);
>> blk = [2,2];
>> fun = @(s)max(s.data(:))*ones(blk,class(s.data));
>> otp = blockproc(ipt,blk,fun)
otp =
240 240 26 26
240 240 26 26
128 128 255 255
128 128 255 255
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!