how to compare 2 binary images pixel by pixel
Mostra commenti meno recenti
hello i need help please.
how to compare 2 binary images pixel by pixel? by using "for" in function "compare"?
it show me error (under text) and i do not know how to solve it:
??? Cell contents reference from a non-cell array object.
Error in ==> compare at 4
if BW1{a,b}==BW2{a,b}
Error in ==> com at 9
if compare(BW1,BW2)>100
i have this code:
if true
n=1;
p=2;
i=1;
max=100;
while p <= max
BW1=im2bw(o{n},0.4); % in "o" are colour pictures
BW2=im2bw(o{p},0.4);
if compare(BW1,BW2)>100
c{i}=o{p};
n=p;
p=p+1;
i=i+1;
else
p=p+1;
end
end
end
and function for compare:
if true
function [same] = compare( BW1, BW2 )
for a=1:500
for b=1:500
if BW1{a,b}==BW2{a,b}
same=same+1;
end
end
end
end
end
2 Commenti
Anmol Narang
il 12 Mar 2016
Image Analyst
il 12 Mar 2016
Deos cpoy and pstae no lenogr wrok on yuor cpmouetr?
Risposta accettata
Più risposte (3)
Image Analyst
il 20 Mar 2014
Lukas, don't loop. It looks like you want to count the number of pixels that are true(1) in both images. If so, just do
bothTrue = BW1 & BW2;
NumPixels = sum(bothTrue(:));
I don't know what you're doing with the "c" and "o" cell arrays and what you're doing with p. It looks like p may likely end up being 100 ("max"). But DO NOT USE max AS THE NAME OF YOUR VARIABLE! max() is a built in function and you'll destroy it if you name your own variable that.
7 Commenti
Image Analyst
il 22 Mar 2014
Looks like you accepted an answer so I guess the above comment no longer applies, so I didn't really examine it.
Image Analyst
il 22 Mar 2014
Here it is calculating practically every thing I can think of:
numTrue1 = sum(BW1(:));
numTrue2 = sum(BW2(:));
bothTrue = BW1 & BW2;
numTrueBoth = sum(bothTrue(:));
numFalse1 = sum(~BW1(:));
numFalse2 = sum(~BW2(:));
bothFalse = ~BW1 & ~BW2;
numTrueBoth = sum(bothFalse(:));
false1true2 = ~BW1 & BW2;
numF1T2 = sum(false1true2(:));
true1False2 = BW1 & ~BW2;
numT1F2 = sum(true1False2(:));
Hopefully you can get whatever you need from that.
Lukas
il 24 Mar 2014
Image Analyst
il 24 Mar 2014
middleRow = ceil(size(BW1, 1)/2);
BW1BottomHalf = BW1(middleRow:end, :);
Then do whatever you want with this half sub-image.
Lukas
il 26 Mar 2014
Lukas
il 21 Mar 2014
0 voti
Augustine Ekweariri
il 22 Nov 2016
You can check the difference using Euclidian distance.
test_img = imread('image1.bmp');
input_im = imread('image2.bmp');
minimum =1000;
[row, col] = size(test_img(:,:,1));
distance = zeros(row, col);
for xAxis = 1 : row
for yAxis = 1 : col
distance(xAxis, yAxis) = sqrt((input_im(xAxis, 1) - test_img(yAxis, 1)).^ 2 + (input_im(xAxis, 2) - test_img(yAxis, 2)).^ 2);
end
end
if distance < minimum
minimum = distance;
end
1 Commento
Image Analyst
il 22 Nov 2016
First of all, you made the common beginner mistake of swapping x and y with row and column. The first index of the image arrays is not the x coordinate. It's the y coordinate and it's deceptive to call the y coordinate of input_img "xAxis". If the image is not square and the number of rows is more than the number of columns, your code will throw an error. Like I said, it's a common mistake, so be careful about that.
Secondly the computation doesn't make sense. You're taking the "distance" between the delta of the first columns and the delta of the second columns. Not only doesn't that make sense, but it ignores all columns from 3 onwards.
Third, using minimum, which goes from a scalar to a 2-D array, is unneeded and never even used.
And finally the whole loop thing could be vectorized into a single line of code.
Categorie
Scopri di più su Creating, Deleting, and Querying Graphics Objects in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!