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 commentaires

Matt J
Matt J le 20 Nov 2019
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
KALYAN ACHARJYA
KALYAN ACHARJYA le 20 Nov 2019
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

Connectez-vous pour commenter.

 Réponse acceptée

Matt J
Matt J le 20 Nov 2019
Modifié(e) : Matt J le 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

Plus de réponses (1)

KALYAN ACHARJYA
KALYAN ACHARJYA le 20 Nov 2019
Modifié(e) : KALYAN ACHARJYA le 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

7 commentaires

Elysi Cochin
Elysi Cochin le 20 Nov 2019
Modifié(e) : Elysi Cochin le 21 Nov 2019
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
KALYAN ACHARJYA
KALYAN ACHARJYA le 20 Nov 2019
Modifié(e) : KALYAN ACHARJYA le 20 Nov 2019
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
Matt J
Matt J le 20 Nov 2019
Modifié(e) : Matt J le 20 Nov 2019
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
Jan
Jan le 21 Nov 2019
@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.
Matt J
Matt J le 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.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Simulink dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by