刚开始用python ,霍夫圆,检测,但是图片中有很多重叠的圆,hough变换就不一定好用了。
可以阈值分割,胶粒和周围颜色有明显边界,
然后用regionprops函数
土豆洋芋山药蛋
图像分割+连通域统计与标注——MATLAB
MATLAB代码:
regionprops方法:
clc,clear
clf;
i=imread('C:\Users\liulang\Desktop\untext.jpg');
I=rgb2gray(i); %转成灰度图
%输出直方图
% figure;imhist(I);
%人工选定阈值进行分割,选择阈值代码在上面两个博客中
%自动选择阈值
T2=graythresh(I);
BW2=im2bw(I,T2);%Otus阈值进行分割
imshow(I,[]);hold on;
[l,m] = bwlabel(BW2);
status=regionprops(l,'BoundingBox');
%圆心,半径,画圆
stats = regionprops('table',BW2,'Centroid',...
'MajorAxisLength','MinorAxisLength')
centers = stats.Centroid;
diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2);
radii = diameters/2;%半径
hold on
viscircles(centers,radii);
hold off
centroid = regionprops(l,'Centroid');
imshow(I,[]);
imfindcircles方法:
查了MATLAB 官网,还有一种方法;怎么感觉这种方法很简洁呢。
clc;clear;close all;
i=imread('C:\Users\liulang\Desktop\untext.jpg');%打开图片
imshow(i,[]);%显示图片
Rmin = 5;%最小半径以像素为单位
Rmax = 25;%最大半径
[centersBright, radiiBright] =
imfindcircles(i,[Rmin Rmax],'ObjectPolarity','bright');%把bright改乘dark就是测外圈适应不同需求,还可以内圈外圈各测一遍取平均值。
%找到图片中在最大最小半径区间内亮亮的圆
viscircles(centersBright, radiiBright,'Color','b');%画圆,颜色,线型
jiaoli=radiiBright/2.517;%像素长度与um转换,
text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'r')