# comparing 3x3 block with center pixel

6 views (last 30 days)
Elysi Cochin on 13 Nov 2019
Commented: Matt J on 21 Nov 2019
i have a matrix as shown below
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
Elysi Cochin on 20 Nov 2019
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

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

KALYAN ACHARJYA on 20 Nov 2019
Edited: KALYAN ACHARJYA on 20 Nov 2019
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
Matt J on 21 Nov 2019
@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.