Effacer les filtres
Effacer les filtres

Problem trying to access labeled portion of images (updated 7/5)

2 vues (au cours des 30 derniers jours)
Ryan
Ryan le 3 Juil 2012
unique(diff(unique(endpts_labeled)))
ans =
1
2
ORIGINAL QUESTION:
I am getting a rare error running the following code on an image of 1px thick skeleton segments:
V(V<=0) = 0; V(V>0) = 1; % Segments <=2 pixels are removed as well earlier
[K n] = bwlabel(V,8);
props = regionprops(K,'Perimeter');
tort = zeros(1,n);
endpts = bwmorph(K,'endpoints');
endpts_labeled = immultiply(K,endpts);
for m = 1:n
[rows,cols] = find(endpts_labeled==m);
p1 = [rows(1),cols(1)]; % Error happens here!!
p2 = [rows(2),cols(2)];
d = sqrt((p1(1)-p2(1))^2+(p1(2)-p2(2))^2);
c = props(m,1).Perimeter/2;
tort(m) = c/d;
end
The error happens when the loop tries to access rows(1) when the numel(rows) = 0. That case should never happen though. This error happened one in every 3 or 4 runs previously when I was using a non-labeled version of the image to find the endpoints, but now that I am using the labeled image to find the endpoints, it is only happening once in a blue moon and I cannot figure out why.
  1 commentaire
Ryan
Ryan le 5 Juil 2012
I have updated the question with the .mat data file. I did not add dbstop if error before this happened.

Connectez-vous pour commenter.

Réponse acceptée

Anton Semechko
Anton Semechko le 6 Juil 2012
Modifié(e) : Anton Semechko le 7 Juil 2012
The error occurs for m=559. If you look at the object:
figure, imshow(K==559)
set(gca,'xlim',[481 580],'ylim',[500 600])
you will see that its a loop that does not have any end points. This is what ultimately causes the error.
  4 commentaires
Ryan
Ryan le 7 Juil 2012
I will upload the image to show you on Monday at the soonest. There is a chance I suppose for loops because the skeleton is coming from an inf- thin with bwmorph, but I do a thicken and re-thin to eliminate them.
Anton Semechko
Anton Semechko le 7 Juil 2012
Modifié(e) : Anton Semechko le 7 Juil 2012
That will be a different question ... I believe this one can be closed

Connectez-vous pour commenter.

Plus de réponses (2)

Image Analyst
Image Analyst le 4 Juil 2012
Modifié(e) : Image Analyst le 4 Juil 2012
I don't know how this could happen. If rows is null, then endpts_labeled==m is completely false. And if that's true, then n must be zero and so the loop never gets entered. That is a contradiction. Try "dbstop if error" and then when it errors, see what n is. Alternatively you can try this (untested)
endpts_labeled = int32(zeros(size(K)));
endpts_labeled(endpts) = K(endpts);
instead of this:
endpts_labeled = immultiply(K,endpts);
in case the immultiply is giving you slight mismatches as referred to in the FAQ http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F
  2 commentaires
Ryan
Ryan le 4 Juil 2012
Will do. I'll update this next time it catches it.
Geoff
Geoff le 4 Juil 2012
Make sure you dump all your variables to a MAT file next time numel(rows) is zero =)

Connectez-vous pour commenter.


Ryan
Ryan le 6 Juil 2012
Modifié(e) : Ryan le 6 Juil 2012
I switched to .* over immultiply() and I haven't run into the error message again. This may not mean I am out of the woods yet, but for anyone else out there that may encounter a similar issue, I wanted the possible solution to be documented.
  3 commentaires
Steve Eddins
Steve Eddins le 6 Juil 2012
K contains all integers, and endpts contains only 0s and 1s. There shouldn't be any quantization error going on here.
Ryan
Ryan le 6 Juil 2012
Do you have an idea as to what would be causing the error then?

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by