✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
基于计算机视觉实现圆的识别附matlab代码
⛄ 代码
%圆的识别
close all;clear all;clc;
%% I.读取图像
I = imread('pillsetc.png');
figure(1),imshow(I);%显示原始图像
%% II.灰度化、二值化
I2 = rgb2gray(I);%灰度化
bw = imbinarize(I2);%二值化
figure(2),imshow(bw)
%% III.形态学处理
%删除包含少于 30 个像素的所有对象
bw = bwareaopen(bw,30);
figure(3),imshow(bw);
%闭运算
se = strel('disk',2);
bw = imclose(bw,se);
figure(4),imshow(bw);
%填充孔洞
bw = imfill(bw,'holes');
figure(5),imshow(bw);
%% IV.寻找边界
[B,L] = bwboundaries(bw,'noholes');%只关注外边界
figure(6),imshow(label2rgb(L,@jet,[.5 .5 .5]))%标记矩阵L转化为RGB图像
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2),boundary(:,1),'w','LineWidth',2);%绘制白色边界线
end
%% V.判断圆形
stats = regionprops(L,'Area','Centroid');%测量图像区域的属性(实际像素数和质心)
threshold = 0.94;%阈值
% 边界循环
for k = 1:length(B)
boundary = B{k};%获取标签“k”对应的(X,Y)边界坐标
%计算物体的近似周长
delta_sq = diff(boundary).^2;
perimeter = sum(sqrt(sum(delta_sq,2)));
area = stats(k).Area;%计算标签‘k’对应的面积
metric = 4*pi*area/perimeter^2;%计算圆度
metric_string = sprintf('%2.2f',metric);%显示结果
%如果圆度大于阈值threshold,则用黑色圆圈表示(代表为圆)
if metric > threshold
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'ko');
end
text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
'FontSize',14,'FontWeight','bold') %在边界左侧显示圆度
end
title('指标越接近1代表越接近圆形');
⛄ 运行结果