答案 0 :(得分:2)
正如尤瓦尔指出的那样,这实际上取决于你所说的常规或不定期。但是,为了快速开始,我采取了一种天真的假设,即常规意味着像圆圈一样。现在检查像素体是否像圆一样我使用regionprops
函数来计算'EquivDiameter'
属性:
返回一个标量,指定与区域面积相同的圆的直径。计算为sqrt(4 * Area / pi)。
然后我使用IOU measure来计算不规则性。为了测试代码,我使用了来自here的图像。
代码是这样的:
clc; close all; clear variables;
%% read image
I = imresize(rgb2gray(imread('maxresdefault.jpg')), 0.5);
I = imfill(medfilt2(I, [3 3])<230,'holes');
% I = imread('1.gif')>0; % load your GIF image
imshow(I); title('Shapes');
%% check irregularity
[L, n] = bwlabel(I);
S = regionprops('table', L, 'Centroid', 'EquivDiameter');
[X, Y] = meshgrid(1:size(I, 2), 1:size(I, 1));
r = zeros(1, n);
for i=1:n
shape = L==i;
circle = ((X-S.Centroid(i, 1)).^2+(Y-S.Centroid(i, 2)).^2)<(S.EquivDiameter(i)/2)^2;
r(i) = 1-bwarea(shape&circle)/bwarea(shape|circle); % calculating ROI
end
%% showing intersection
figure;
circs = im2double(repmat(I, 1, 1, 3));
circs = insertShape(circs, 'filledcircle', [S.Centroid S.EquivDiameter/2], 'LineWidth', 5);
imshow(circs); title('Intersections');
%% showing results
figure;
map = jet(256);
O = zeros(size(I), 'uint8');
for i=1:n
ind = max(1,round(r(i)*256));
O(L==i) = ind;
end
O = label2rgb(O, map);
O = insertText(O, S.Centroid, r, 'AnchorPoint', 'center', 'FontSize', 18);
imshow(O); title('Irregularity');
colormap jet;
colorbar('ticks', [0 1], 'TickLabels',{'Regular','Irregular'})
<强>结果:强>
答案 1 :(得分:0)
或者只是您可以使用
测量圆度指数 circularity_index=((4*np.pi*R.area)/pow(R.perimeter,2)) # circularity