MATLAB 2x2 maximum fill

1 vue (au cours des 30 derniers jours)
Fabio Corres
Fabio Corres le 11 Mar 2017
Commenté : Fabio Corres le 11 Mar 2017
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

Réponse acceptée

Stephen23
Stephen23 le 11 Mar 2017
Modifié(e) : Stephen23 le 11 Mar 2017
Method One: blockproc:
>> 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
Method Two: mat2cell, cellfun, and cell2mat:
>> 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
Method Three: kron and accumarray:
>> 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
Method Four: reshape, permute, and kron:
>> 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 commentaires
Stephen23
Stephen23 le 11 Mar 2017
Modifié(e) : Stephen23 le 11 Mar 2017
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
Fabio Corres
Fabio Corres le 11 Mar 2017
It works thank you

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by