Image processing code debugging

1 次查看(过去 30 天)
Hi, I am doing image processing and plans to extract some information from a binary image, however I have encountered some bugs that I can't solve.
Here is the error:
Error using double
Conversion to double from struct is not possible.
Error in ^ (line 44) (the thing is that my code only has 43 lines I dont kno how this error show up)
X = double(X);
Error in features (line 16)
C = P^2/(4 * pi * A);
Here is the code:
% To compute the features;
% input is the binary thresholded image
% outputs are the feature values
function [P, A, C, xbar, ybar, phione] = features(Iin)
%perimeter
P = regionprops(Iin, 'Perimeter'); %regionprops computes the perimeter
%by calculating the distance between
%each adjoining pair of pixels around
%the border of the binary image.
%area
A = sum(sum(Iin == 255)); %summing the number of pixel that are white
%compactness
C = P^2/(4 * pi * A);
%centroid
[rows cols] = size(I);
m = zeros(rows, cols);
for i = 0:1
for j = 0:1
for x=1:rows
for y=1:cols
m(i+1, j+1) = m(i+1, j+1) + (x^i * y^j * I(x,y));
end
end
end
end
xbar = m(2,1) / m(1,1); %m10/m00
ybar = m(1,2) / m(1,1); %m01/m00
%invariant moment
n=[ 0 0 0 0; 0 0 0 0; 0 0 0 0; 0 0 0 0];
for i = 0:3
for j = 0:3
n(i+1,j+1) = u(i+1,j+1)/(u(1,1)^(1+(i+j)/2));
end
end
phione = n(3,1) + n(1,3); %n(2,0) + n(0,2)
end
  2 个评论
Miles Hao Peng Su
Miles Hao Peng Su 2022-11-6
Aye thanks! I checked it up and replaced with the following line,
P = sum(sum(bwperim(Iin)==1));
Now it works!
Thanks!
Image Analyst
Image Analyst 2022-11-6
No. Don't do it that way! Didn't you see my answer below???

请先登录,再进行评论。

采纳的回答

KSSV
KSSV 2022-11-6
移动:Image Analyst 2022-11-6
This line:
P = regionprops(Iin, 'Perimeter');
Check the class of P
class(P)
It seems it is a structure and you can use it in the line:
C = P^2/(4 * pi * A);
So check P and extract the field you want and substitue it in the line.
  1 个评论
Miles Hao Peng Su
Miles Hao Peng Su 2022-11-6
Aye thanks! I checked it up and replaced with the following line:
P = sum(sum(bwperim(Iin)==1));
Now it works!
Thanks!

请先登录,再进行评论。

更多回答(1 个)

Image Analyst
Image Analyst 2022-11-6
Scrap all that. Your Compactness is called "Circularity" and you can ask regionprops for the centroids, etc.:
function [P, A, C, xbar, ybar, phione] = features(Iin)
props = regionprops(Iin, 'Circularity', 'Centroid', 'Area', 'Perimeter');
A = [props.Area]; % List of all blob areas.
P = [props.Perimeter]; % List of all blob perimeters.
C = [props.Circularity]; % Circularities = (4*Area*pi)/(Perimeter^2)
xy = vertcat(props.Centroid); % List of all (x,y) centroid coordinates. Each blob's coordinates is in a row.
xbar = xy(:, 1); % x coordinate of the blob centroids.
ybar = xy(:, 2); % y coordinate of the blob centroids.
  2 个评论
Miles Hao Peng Su
Miles Hao Peng Su 2022-11-6
Thanks for the help! I am currently learning image processing and can't use most of the off the shelf codes >< I will save this page when I need to use them later! Thanks!
Image Analyst
Image Analyst 2022-11-6
编辑:Image Analyst 2022-11-6
But I didn't use any more "off the shelf" functions than you. In fact, I used fewer. You used regionprops like me but you also used - unnecessarily I might add -- bwperim. I don't know what functions you are allowed to use or not use, but you used regionprops so I assume that's allowed and that's all I used. I assume non-toolbox functions like vertcat and sum are allowed.
There is a lot that can be improved with your codes. For example there might be multiple blobs in general so you can't do what you did. You should do
P = regionprops(Iin, 'Circularity', 'Centroid', 'Area', 'Perimeter');
A = [P.Area]; % List of all blob areas.
allPerims = [P.Perimeter]; % List of all blob perimeters.
C = allPerims.^2 ./ (4 * pi * A); % Doing it yourself instead of useing regionprops.
You need to use use the ".Perimeter" field and use square brackets around it do collect perimeters from (possibly) multiple blobs into one list (vector). That's because your P is a structure, even if it's just one blob you are looking at.
I think you could learn much from it.
If I've helped you consider clicking the "Vote" icon for my answer. I think it's a better approach than what you suggested or accepted.

请先登录,再进行评论。

Community Treasure Hunt

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

Start Hunting!

Translated by