本文主要使用了matlab中的imfindcircles函数,功能参数详见其文档。其主要使用Hough变换的方法提取图片中圆形信息。

  • 使用此函数需要注意的几点:

1)当 radius(或 rmin)的值小于或等于 5 时,imfindcircles 的准确度会受到限制;

2)imfindcircles 找不到圆心位于图像区域之外的圆形;

3)imfindcircles 会预处理二值(逻辑值)图像以提高结果的准确度。在处理真彩色图像之前,它使用 rgb2gray 函数将其转换为灰度图像。

%此程序用来识别和跟踪视频中的颗粒及其轨迹%% 读取图片信息
% %test;
% RGB= imread('F:\desktop\轨迹熵\实验\目标检测跟踪\granule4.png');
% imshow(RGB)% 将视频拆解成图片;
video = VideoReader('E:\20220326\125-2fps.avi');
N_Frames = video.NumFrames;   %得到帧数
H = video.Height;     %得到高度
W = video.Width;      %得到宽度
Rate = video.FrameRate;
% Preallocate movie structure.
% mov(1:nFrames) = struct('cdata',zeros(H,W,3,'uint8'),'colormap',[]);
%read one frame every time
% for i = 1:1000
%     mov(i).cdata = read(video,i);
%     RGB= mov(i).cdata;
% %     disp('当前播帧数:'),disp(i);
% %     imshow(RGB);
% end% 由于不需要存储每张图片,所以不需要mov结构来储存数据;
%待将此处化为循环结构;%test
i=1156810;
RGB=read(video,i);
bw=imbinarize(RGB,'global');         %imfindcircles函数本身是先把图片转为二值图,但是并不会选择性的去掉连通像素小于某一阈值的区域;%所以此步骤看似重复,但其实是为bwareaopen函数做准备;%由于图片本来就是灰度图,直接转为二值图;bw=bwareaopen(bw,60);   %去掉连通像素小于60的区域;%注意在识别之前,需要先取一个很大的半径范围,进而确认目标是在哪个范围之内,缩小范围,进而节省上述手动划线过程;
%如果被识别的颗粒直径有变化需要修改此参数!!!!!!!!!!!!!!!
Rmin = 7;
Rmax = 16;
[center, radius]=imfindcircles(bw,[Rmin Rmax],'Sensitivity',0.9,'ObjectPolarity','bright');    %调节ObjectPolarity属性可以实现对不同颜色的区分;
imshow(bw);
h=viscircles(center,radius);     %显示圆形轮廓;% immatrix=imshow(bw);        %将图片化为数值矩阵;%数据输出的文件夹目标名;
folder_name='E:\20220326';% %服务器上使用工作文件当前文件夹;
%待查
% folder_name=pwd;     %显示当前文件夹绝对路径字符串,当然也可以不用绝对路径;%在当前文件夹(程序所在文件夹)创建data数据文件;
%如果文件夹已经存在,则会发出警告,但是无碍下一步操作;
% mkdir('data');      %服务器上可使用相对目录;
mkdir(strcat(folder_name,'\data' ));    %注意在服务器下可以使用相对路径,即不使用绝对路径;
fid_position=fopen(strcat(folder_name,'\data\125-2fps_position.txt'),'w');
fid_problem=fopen(strcat(folder_name,'\data\125-2fps_position_problem.txt'),'w');tic
for i=376841:1:739966RGB=read(video,i);bw=imbinarize(RGB,'global');    %由于图片本来就是灰度图,直接转为二值图;%此处为了提高后续的识别成功率;%多出此步骤,主要是为了后面消除连片像素小的区域,imfindcircles函数本身当然也会有二值化过程,速度%总体与之前基本持平;%默认情况下,imbinarize 使用 Otsu%方法,该方法选择特定阈值来最小化阈值化的黑白像素的类内方差;bw=bwareaopen(bw,60);   %去掉连通像素小于60的区域;%注意在识别之前,需要先取一个很大的半径范围,进而确认目标是在哪个范围之内,缩小范围,进而节省上述手动划线过程;%如果被识别的颗粒直径有变化需要修改此参数!!!!!!!!!!!!!!!Rmin = 7; Rmax = 16;[center, radius]=imfindcircles(RGB,[Rmin Rmax],'Sensitivity',0.9,'ObjectPolarity','bright');    %调节ObjectPolarity属性可以实现对不同颜色的区分;%此处sensitivity的值在0.9附近对结果影响很敏感,0.9为一经验值;
%     disp(i);    if length(center)==10for j=1:1:10fprintf(fid_position,'%15.10f %15.10f\n',center(j,:));end     elseif length(center)>10disp('oh no');
%         imshow(bw);
%         h=viscircles(center,radius);     %显示圆形轮廓;
%         drawnow;disp(i);disp(center);%有时识别出的圆的数量大于实际数量,需要剔除多于的圆心数据;D=pdist(center);    %计算行与行之间的欧几里得距离;Z=squareform(D);    %为了方便识别行号和列号,将上述结果转为方阵,第i行j列,即代表center第i行与第j行所代表向量之间的距离;U=triu(Z);          %为了方便识别行号和列号,只取出矩阵的上三角部分;[row,col]=find(U>0 & U<10);       %如果圆心距离大于0小于10,则认为两个圆心重复;如果被识别的颗粒直径有变化需要修改此参数!!!!!!!!center(row,:)=[];     %任意去掉其中重复的圆心;if length(center)~=10disp(['There is a problem with this frame:',num2str(i)]);     %以防万一;disp(center);fprintf(fid_problem,'%10d\n',i);for j=1:1:10fprintf(fid_position,'%15.10f %15.10f\n',zeros(1,2));     %为了后续处理数据的方便(数据长度不发生变化),在有问题的插入0值,供后续更改;%注意如果被检测圆的数量发生改变,这里需要更改数目!!!!!!endelsedisp('successful!!!');disp(center);for j=1:1:10fprintf(fid_position,'%15.10f %15.10f\n',center(j,:));endend%有时识别出的圆的数量小于实际数量,暂无更好的办法,此处调节识别圆的sensitivity,但是有风险;elsedisp(['There is a problem with this frame:',num2str(i)]);     %以防万一;disp(center);fprintf(fid_problem,'%10d\n',i);for j=1:1:10fprintf(fid_position,'%15.10f %15.10f\n',zeros(1,2));     %为了后续处理数据的方便(数据长度不发生变化),在有问题的插入0值,供后续更改;%注意如果被检测圆的数量发生改变,这里需要更改数目!!!!!!endend
%     imshow(bw)
%     h=viscircles(center,radius);     %显示圆形轮廓;
%     drawnow;    %为了连续显示图窗;
endfclose(fid_position);
fclose(fid_problem);toc%注意检查各矩阵是否与实际颗粒的数目是否一样;%% 将图片转为二值图片,凸显边缘% % I = rgb2gray(RGB);   %图片本来就是灰度图片,不需要再转为灰度图;
% imhist(RGB);    %查看图片的灰度分布
% bw = imbinarize(RGB);    %由于图片本来就是灰度图,直接转为二值图;
% % imshow(bw)
% imhist(bw);    %查看图片的灰度分布
% imwrite(bw,'E:\20220326\125-2fps.png');
%
% % 删除包含少于阈值像素的所有对象
% bw = bwareaopen(bw,60);
% imshow(bw)% % 填充笔帽中的间隙
% se = strel('disk',2);
% bw = imclose(bw,se);
% imshow(bw)%
% %填充任何孔洞,以便可以使用 regionprops 来估计每个边界所包围的面积
% bw = imfill(bw,'holes');
% imshow(bw)% %手动估算颗粒直径的长度
% d = drawline;   %在figure图中对颗粒的直径划线
% pos = d.Position;
% diffPos = diff(pos);
% diameter = hypot(diffPos(1),diffPos(2))
  • 注意此识别程序并不能完全理想的挑选出所有的圆形,程序中把异常值的情况挑选了出来,输出到了

‘E:\20220326\125-2fps_position_problem.txt’

  • 识别正常的情况:

  • 识别异常情况:

图 原始图片(灰度图片)

图 出现异常的识别结果(在灰度图下)

图 出现异常的识别结果(在二值图下)

有阴影球体图片

有阴影球体识别结果(灰度图)

有阴影球体识别结果(二值图)

参考文献:

检测圆形目标

检测和测量图像中的圆形目标

Measuring the Radius of a Roll of Tape

MATLAB: Image Prosessing Toolbox

matlab:圆形的图像识别(二)相关推荐

  1. matlab绘制X,Y二维散点图并标出序号

    matlab绘制X,Y二维散点图并标出序号 标签: matlab 2016-11-22 12:20 193人阅读 评论(0) 收藏 举报  分类: matlab(1)  版权声明:本文为博主原创文章, ...

  2. MATLAB学习笔记(二)

    MATLAB学习笔记(二) 一.矩阵运算 矩阵分析 向量和矩阵的范数运算 矩阵的秩 矩阵的化零矩阵 矩阵的化简rref()函数 线性方程组 超定线性方程组求解 矩阵分解 1.对称正定矩阵的Choles ...

  3. matlab画二维颜色深浅,matlab中如何为二维图形填充渐进的颜色

    t1=(0:11)/11*pi; t2=(0:400)/400*pi; t3=(0:50)/50*pi; y1=sin(t1).*sin(9*t1); y2=sin(t2).*sin(9*t2); y ...

  4. matlab晶体能带,matlab平面波展开法的二维光子晶体能带研究+程序

    摘  要 :二维光子晶体可以作为对光子传输控制的新型材料.本文主要通过平面波展开法对二维光子晶体进行数值计算及其性质分析.首先我们介绍了二维光子晶体的基础概念.结构.介电性能等特性.然后基于麦克斯韦方 ...

  5. matlab脚本文件求梯度,转:用MATLAB求梯度的二个实例

    用MATLAB求梯度的二个实例 1.在上MATLAB课的时候,有学生问怎么用gradient函数求f=2x2+3y3的梯度啊,不懂得怎么写格式,试了很多次都不行.解答如下: 在MATALB中,求梯度只 ...

  6. 《图形图像处理》— 使用matlab对图像进行二值化和灰度化处理

    用matlab对图像进行二值化处理 >>m = imread('d:\image\logo.jpg'); >> imshow(n); >> n = graythre ...

  7. MATLAB绘图(特殊二维)

    MATLAB其他形式的二维图形 对函数自适应采样的绘图函数 fplot函数 fplot(filename,lims,选项) 程序示例: f=@sin; fplot(f,[0,2*pi],'*'); f ...

  8. matlab图形设计界面 文献翻译,毕业设计基于matlab的数字图像识别的设计与实现文献翻译V8.1(资料4)...

    <[毕业设计]基于matlab的数字图像识别的设计与实现文献翻译.doc>由会员分享,可免费在线阅读全文,更多与<毕业设计基于matlab的数字图像识别的设计与实现文献翻译(V8.1 ...

  9. matlab三维数组与二维矩阵相乘问题

    Matlab三维数组与二维矩阵相乘问题 近来在搞一个改进近场music算法的仿真问题,用matlab进行二维搜索的时候写了很多for循环,导致运行速度极慢.考虑到matlab语言本身的矩阵运算特点,改 ...

  10. matlab三维图、二维云图的可视化绘图

    matlab三维图.二维云图的可视化绘图 matlab三维图.二维云图的可视化绘图 1.meshgrid生成数据矩阵 2.可视化方案 3.shading类型 matlab三维图.二维云图的可视化绘图 ...

最新文章

  1. 对MBProgressHUD进行封装并精简使用
  2. 华硕笔记本自带win10改win7的方法
  3. Python列表之for循环应用
  4. 刚构桥的优缺点_连续刚构桥相对于连续梁来说有优点吗
  5. CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题
  6. 【笔试常考】C语言:深度剖析strlen,sizeof
  7. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)
  8. ps制作html图标素材,PS按钮图标制作
  9. html引用ttf字体文件
  10. ANSYS12.0安装教程
  11. 完美解决C#中拖动splitContainer分割线时显示虚线问题
  12. win10命令行压缩/解压缩文件
  13. 2020年中国天线行业发展现状及细分市场结构分析[图]
  14. 好课堂Scratch编程08 趣学篇(四)密林深处的危险气息
  15. 【服务器风扇静音】确定风扇线序定义的通用方法——以IBM SystemX 3630 M4为例
  16. pacman入门使用指南
  17. 搞算法的仙女妹子,爱了!!
  18. Scrum团队: I-型人 vs T- 型人
  19. Vmware 虚拟机设置主机映射端口
  20. codeforces 85D. Sum of Medians(线段树or分块)

热门文章

  1. OSI七层网络协议(应用层:http协议、传输层:TCP协议、网络层:IP协议,数据链路层:ARP协议、网络下一跳,物理层:比特流)
  2. PN结相关知识点(PN结原理)
  3. 原创|批处理|Monkey自动测试工具批处理版
  4. 为什么低通滤波器的作用相当于积分器
  5. kettle 创建脚本文件
  6. MatLab 计算开根号
  7. 爱剪辑显示服务器繁忙,爱剪辑视频卡顿怎么回事 爱剪辑视频卡顿解决方法
  8. 海康视频转码 - 标准mp4格式(java)
  9. 单应性变换(Homography)的学习与理解
  10. 静态测试和动态测试相关知识点