How to resolve the error of looping
Show older comments
Dear All,
I wrote some script looping to determine the thresh value for certain volume (26.67). But I got error like below. The set imageas data set as attached.
Can help me?
%% I131 10:1 graycutoff 100000 latest GUNA FWHM
clc
clear all
close all
[spect map]=dicomread('I-131sphere10nisbah1.dcm');
info = dicominfo('I-131sphere10nisbah1.dcm');
%gp=info.SliceThickness;
spect=(squeeze(spect));%smooth3
aa=size(spect);aa=aa(3);
imshow3D(spect)
figure, imtool3D(spect)
seedR1 = 58; seedC1 = 76; seedP1 = 45;
W = graydiffweight(spect, seedC1, seedR1, seedP1, 'GrayDifferenceCutoff', 1000000000);
for thresh =0.0001:0.0001:0.9999;
[BW, D] = imsegfmm (W, seedC1, seedR1, seedP1, thresh);
T = regionprops ('table', BW,'Area','Centroid');
if T(1)==26.67; %want to know thresh value for volume 26.67
gray_weight = thresh;
volume = T(1)
break
end
end
Error using ()
Subscripting into a table using one subscript (as in t(i)) is not supported. Specify a row
subscript and a variable subscript, as in t(rows,vars). To select variables, use t(:,i) or for
one variable t.(i). To select rows, use t(i,:).
Answers (1)
Image Analyst
on 18 Nov 2023
0 votes
T is a table with the first column being the blob area and the second column being (x,y) of the centroid. Row 1 is for blob %1, row 2 is for blob #2, and so on. T(1) doesn't make sense because T, when using numerical indexes, is a 2-D array, not a 1-D array. So if you wanted the area of blob #2, you'd reference it with 2 indexes as T{2, 1} (with braces) or as T.Area(2) (equivalent but using the variable name of the column). I don't know how many blobs you will have in your binary image.
And you should not use regionprops for volumes, you should use the 3-D version regionprops3 to get volume of blobs.
Also you should not use fractional numbers for the area or volume since regionprops returns them as integer values (the discrete number of pixels or voxels), not as floating point areas or volumes. Even if it were, you should not compare floating point numbers with ==, you should use ismembertol. See the FAQ: https://matlab.fandom.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_(or_similar)_not_equal_to_zero?
6 Comments
mohd akmal masud
on 19 Nov 2023
regionprops found either no blobs or one blob, so row 2 of the table does not exist.
Do not use == to compare floating point numbers. == between two values of the same data type looks for bit-for-bit being exactly the same (with the exception that +0 and -0 are treated as equal.) It is extremely improbable that you will get a blob with area exactly
fprintf('%.999g\n', 26.67)
You would be much more likely to get a blob whose area was 26 + 2/3 to within rounding error.
See ismembertol
mohd akmal masud
on 19 Nov 2023
mohd akmal masud
on 19 Nov 2023
Edited: mohd akmal masud
on 19 Nov 2023
Walter Roberson
on 19 Nov 2023
you posted this as s new question and I answered there
Peter Perkins
on 20 Nov 2023
You might find T.Area(1), or even T{1,"Area"}, easier to read than T{1,1}.
Categories
Find more on Image Segmentation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!