New here, i cannot figure it out ( Index exceeds the number of array elements (2). )
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
i=imread('1_crack.png');
bw=rgb2gray(i);
[S T]=graythresh(bw);
bw=imbinarize(bw,S);
bwn1=bw_filter(bw,15);
f = ones(3,3) / 9;
smooth_0 = imfilter(bw,f);
for i = 1:5
smooth_0 = imfilter(smooth_0,f);
end
[canny_smooth_0,thres_0] = edge(smooth_0,'canny');
[canny_smooth_0,thres_0] = edge(smooth_0,'canny',thres_0);
canny_smooth_0 = uint8(canny_smooth_0) * 255; %把遮罩轉換成影像
bwn1=canny_smooth_0;
bwn1 = imfill(bwn1, 'holes');
labeledImage = bwlabel(bwn1);
% % Measure the area
measurements_o = regionprops(labeledImage, 'Area');
[~, columns] = size(bw);
% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.
boundaries = bwboundaries(bw); %跟蹤二值圖像中的區域邊界
numberOfBoundaries = size(boundaries, 1);
for blobIndex_o = 1 : numberOfBoundaries
thisBoundary = boundaries{blobIndex_o};
x_o = thisBoundary(:, 2); % x = columns.
y_o = thisBoundary(:, 1); % y = rows.
% Find which two bounary points are farthest from each other.
maxDistance_o = 0;
for k = 1 : length(x_o)
distances = sqrt( (x_o(k) - x_o) .^ 2 + (y_o(k) - y_o) .^ 2 );
[thisMaxDistance, indexOfMaxDistance] = max(distances);
if thisMaxDistance > maxDistance_o
maxDistance_o = thisMaxDistance;
index1_o = k;
index2_o = indexOfMaxDistance;
end
end
% Find the midpoint of the line.
xMidPoint_o = mean([x_o(index1_o), x_o(index2_o)]);
yMidPoint_o = mean([y_o(index1_o), y_o(index2_o)]);
longSlope = (y_o(index1_o) - y_o(index2_o)) / (x_o(index1_o) - x_o(index2_o));
perpendicularSlope = -1/longSlope;
% Use point slope formula (y-ym) = slope * (x - xm) to get points
y1_o = perpendicularSlope * (1 - xMidPoint_o) + yMidPoint_o;
y2_o = perpendicularSlope * (columns - xMidPoint_o) + yMidPoint_o;
% Get the profile perpendicular to the midpoint so we can find out when if first enters and last leaves the object.
[cx_o,cy_o,c] = improfile(bw,[1, columns], [y1_o, y2_o], 1000);
% Get rid of NAN's that occur when the line's endpoints go above or below the image.
c(isnan(c)) = 0;
firstIndex_o = find(c, 1, 'first');
lastIndex_o = find(c, 1, 'last');
% Compute the distance of that perpendicular width.
perpendicularWidth_o = sqrt( (cx_o(firstIndex_o) - cx_o(lastIndex_o)) .^ 2 + (cy_o(firstIndex_o) - cy_o(lastIndex_o)) .^ 2 );
% Get the average perpendicular width. This will approximately be the area divided by the longest length.
averageWidth_o = measurements_o(blobIndex_o).Area / maxDistance_o;
end
error : Index exceeds the number of array elements (2).
0 Kommentare
Antworten (2)
Simon Chan
am 12 Mär. 2022
The labeledImage is based on 'bwn1' and I think you should also use 'bwn1' instead of 'bw' when finding their boundaries.
[~, columns] = size(bwn1);
% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.
boundaries = bwboundaries(bwn1); %跟蹤二值圖像中的區域邊界
0 Kommentare
yanqi liu
am 14 Mär. 2022
clc; clear all; close all;
i=imread('image.png');
bw=rgb2gray(i);
[S T]=graythresh(bw);
bw=imbinarize(bw,S);
% bwn1=bw_filter(bw,15);
f = ones(3,3) / 9;
smooth_0 = imfilter(bw,f);
for i = 1:5
smooth_0 = imfilter(smooth_0,f);
end
[canny_smooth_0,thres_0] = edge(smooth_0,'canny');
[canny_smooth_0,thres_0] = edge(smooth_0,'canny',thres_0);
canny_smooth_0 = uint8(canny_smooth_0) * 255; %把遮罩轉換成影像
bwn1=canny_smooth_0;
bwn1 = imfill(bwn1, 'holes');
labeledImage = bwlabel(bwn1);
% % Measure the area
measurements_o = regionprops(labeledImage, 'Area');
[~, columns] = size(bw);
% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.
boundaries = bwboundaries(~bw); %跟蹤二值圖像中的區域邊界
numberOfBoundaries = size(boundaries, 1);
for blobIndex_o = 1 : size(boundaries,1)
thisBoundary = boundaries{blobIndex_o};
x_o = thisBoundary(:, 2); % x = columns.
y_o = thisBoundary(:, 1); % y = rows.
% Find which two bounary points are farthest from each other.
maxDistance_o = 0;
for k = 1 : length(x_o)
distances = sqrt( (x_o(k) - x_o) .^ 2 + (y_o(k) - y_o) .^ 2 );
[thisMaxDistance, indexOfMaxDistance] = max(distances);
if thisMaxDistance > maxDistance_o
maxDistance_o = thisMaxDistance;
index1_o = k;
index2_o = indexOfMaxDistance;
end
end
if index2_o > length(x_o)
continue;
end
% Find the midpoint of the line.
xMidPoint_o = mean([x_o(index1_o), x_o(index2_o)]);
yMidPoint_o = mean([y_o(index1_o), y_o(index2_o)]);
longSlope = (y_o(index1_o) - y_o(index2_o)) / (x_o(index1_o) - x_o(index2_o));
perpendicularSlope = -1/longSlope;
% Use point slope formula (y-ym) = slope * (x - xm) to get points
y1_o = perpendicularSlope * (1 - xMidPoint_o) + yMidPoint_o;
y2_o = perpendicularSlope * (columns - xMidPoint_o) + yMidPoint_o;
% Get the profile perpendicular to the midpoint so we can find out when if first enters and last leaves the object.
[cx_o,cy_o,c] = improfile(bw,[1, columns], [y1_o, y2_o], 1000);
% Get rid of NAN's that occur when the line's endpoints go above or below the image.
c(isnan(c)) = 0;
firstIndex_o = find(c, 1, 'first');
lastIndex_o = find(c, 1, 'last');
% Compute the distance of that perpendicular width.
perpendicularWidth_o = sqrt( (cx_o(firstIndex_o) - cx_o(lastIndex_o)) .^ 2 + (cy_o(firstIndex_o) - cy_o(lastIndex_o)) .^ 2 );
% Get the average perpendicular width. This will approximately be the area divided by the longest length.
bwi = ~bw;
bwi = bwselect(bwi, round(thisBoundary(:, 2)), round(thisBoundary(:, 1)));
measurements_oi = regionprops(bwi, 'Area');
if isempty(measurements_oi)
continue;
end
averageWidth_o = measurements_oi.Area / maxDistance_o;
end
0 Kommentare
Siehe auch
Kategorien
Mehr zu Computer Vision with Simulink finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!