comparing 3x3 block with center pixel

i have a matrix as shown below
Untitled.png
i wanted to take 3x3 pixel and take 3 pixels at a time along with the center pixel,
and compare the selected 3 pixel value with the center pixel,
and if 2 or morepixel has value greater than the center pixel and i wanted to assign 1 to it else 0
So in this case i will get 0-1-1-0 and then convert the binary 0110 to its corresponding decimal value = 6
Then the next 3x3 pixel
Untitled1.png

4 Comments

Do you take the 3x3 blocks in non-overlapping tiles or is it a sliding window?
sir i'm doing the loop as
for i=2:Row-1
for j=2:Col-1
%"computation"
end
end
You did not answered the @Matt J question.
Also is the start pixel at 70 or 200?
What about boundary pixels?
same as in LBP code
I need overlapping 3x3 blocks
So the above for loop goes overlapping right?
Boundary pixels also needed, i wrote so, thinking to take 3x3 pixel, i can do i-1, j-1, i, j, i+1, j+1
Am i wrong? Or should i rewrite the for loop as
for i=1:Row
for j=1:Col
%"computation"
end
end

Sign in to comment.

 Accepted Answer

Matt J
Matt J on 20 Nov 2019
Edited: Matt J on 20 Nov 2019
Here, X is the input matrix.
result=0;
result=result+1*rot90(fkernel(rot90(X,+1)),-1);
result=result+2*rot90(fkernel(rot90(X,+2)),-2);
result=result+4*fkernel(X);
result=result+8*rot90(fkernel(rot90(X,-1)),+1);
function Y=fkernel(X)
[m,n]=size(X);
Y=nan(m-2,n-2);
for i=1:n-2
B=X(:,i:i+2);
Y(:,i)=sum(B(1:m-2,:)>=B(2:m-1,2),2)>=2;
end
end

More Answers (1)

Self Declaration: Odd Way but simpler
for i=2:Row-1
for j=2:Col-1
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i,j-1)+mat(i,j)<mat(i+1,j-1))=>2
data(1)=1;
else
data(1)=0;
end
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i-1,j+1))=>2
data(2)=1;
else
data(2)=0;
end
if (mat(i,j)<mat(i+1,j-1)+mat(i,j)<mat(i_1,j)+mat(i,j)<mat(i+1,j+1))=>2
data(3)=1;
else
data(3)=0;
end
if (mat(i,j)<mat(i-1,j+1)+mat(i,j)<mat(i,j+1)+mat(i,j)<mat(i+1,j+1))=>2
data(4)=1;
else
data(4)=0;
end
mat(i,j)=bin2dec(logical(data));
end
end

7 Comments

when i did as below, i'm getting the follwoing error
"Error using bin2dec
Input must be a character vector."
How to rectify it?
mat = [70 20 100 24 89; 230 200 220 78 55; 210 80 10 57 34; ...
110 94 67 88 28; 32 36 89 78 58; 59 73 54 68 48];
[Row, Col] = size(mat);
for i=2:Row-1
for j=2:Col-1
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i,j-1)+mat(i,j)<mat(i+1,j-1))>=2
data(1)=1;
else
data(1)=0;
end
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i-1,j+1))>=2
data(2)=1;
else
data(2)=0;
end
if (mat(i,j)<mat(i+1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i+1,j+1))>=2
data(3)=1;
else
data(3)=0;
end
if (mat(i,j)<mat(i-1,j+1)+mat(i,j)<mat(i,j+1)+mat(i,j)<mat(i+1,j+1))>=2
data(4)=1;
else
data(4)=0;
end
mat(i,j)=bi2de(logical(data))
end
end
use Logical, no need to combine separately
Easier:
for i=2:Row-1
data = zeros(1, 4);
for j=2:Col-1
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i,j-1)+mat(i,j)<mat(i+1,j-1))>=2
data(1) = 8;
end
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i-1,j+1))>=2
data(2) = 4;
end
if (mat(i,j)<mat(i+1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i+1,j+1))>=2
data(3) = 2;
end
if (mat(i,j)<mat(i-1,j+1)+mat(i,j)<mat(i,j+1)+mat(i,j)<mat(i+1,j+1))>=2
data(4) = 1;
end
mat(i,j) = sum(data);
end
end
I think Jan's modification would really need to be as follows,
out=zeros(size(mat));
data = zeros(1, 4);
for i=2:Row-1
for j=2:Col-1
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i,j-1)+mat(i,j)<mat(i+1,j-1))>=2
data(1) = 8;
end
if (mat(i,j)<mat(i-1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i-1,j+1))>=2
data(2) = 4;
end
if (mat(i,j)<mat(i+1,j-1)+mat(i,j)<mat(i-1,j)+mat(i,j)<mat(i+1,j+1))>=2
data(3) = 2;
end
if (mat(i,j)<mat(i-1,j+1)+mat(i,j)<mat(i,j+1)+mat(i,j)<mat(i+1,j+1))>=2
data(4) = 1;
end
out(i,j) = sum(data); data(:)=0;
end
end
@Matt J: You are right, modifying mat inside the loop, which uses mat as input also is not wanted. If you declare data before the loops and reset the values to 0 by data(:)=0 or if it is recreated by zeros(1,4) does not really matter. For large arrays one of the methods might be faster than the other.
@Jan: It does matter however, that you were recreating data outside the j-loop. It needs to be reset inside both loops after each (i,j) is processed.

Sign in to comment.

Categories

Find more on Simulink in Help Center and File Exchange

Asked:

on 13 Nov 2019

Commented:

on 21 Nov 2019

Community Treasure Hunt

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

Start Hunting!