使用语言:matlab
圆形检测
%圆形检测demo
%可以自己设置边缘检测算子
clear;clc;close all
I=rgb2gray(imread("D:\图片库\图片库\涂鸦\_J5A1617.JPG"));
SE=strel('ball',5,5);%构造圆形结构元素
I2=imdilate(I,SE);%膨胀
I2=imerode(I2,SE);%腐蚀
BW=edge(I2);
imshow(BW);
[c,r]=imfindcircles(BW,[20 300],'ObjectPolarity','dark');
viscircles(c,r,'LineStyle','--');
先闭操作关闭前景物体中的小孔
多边形检测
clear;clc;clear all
I=imread("C:\Users\admin\Desktop\1.png");
BW=rgb2gray(I);
BW=edge(BW,'canny');
BW=bwareaopen(BW,800);%删除像素点小于100的连通分量
[L,num]=bwlabel(BW,8);%应用8连通区域获得N个不同区域
%将笛卡尔坐标系换成极坐标系,并求出角度和长度的关系
for n=1:num
temp=L==n;%每一个模块都被标记成了数字
%去除全为零的行列
temp=temp(any(temp'),:);
temp=temp(:,any(temp'));
[S_x,S_y]=size(temp);
[x,y]=find(temp~=0);%找到边界点坐标
x=(x-S_x/2)./S_x;y=(y-S_y/2)./S_y;%移动原点到中间位置,由于行列比例不同,需进行归一化
[theta,rho]=cart2pol(x,y);%将笛卡尔坐标转化为极坐标
r=sortrows([theta/pi*180,rho]);%依照角度排序
%如果ρmin不在第一或者最后,将ρ最小的前面的角度加上360°并移到最后
if min(r(:,2))~=r(1,2)||min(r(:,2))~=r(1,end)
[addr,~]=find(min(r(:,2))==r(:,2));%找到最小值所在的点,最小值的位置也许不止一个
r(1:addr(1)-1,1)=r(1:addr(1)-1,1)+360;
r=circshift(r,1-addr(1));%向后移
theta=r(:,1)/max(r(:,1));tho=r(:,2)/max(r(:,2));%归一化
end
%显示
subplot(2,num,n);imshow(temp);
subplot(2,num,n+num);plot(theta,tho);%θ和ρ的关系图
title('θ和ρ的关系图')
%根据抽样样本的极大值判断类型
tho=tho(round(linspace(1,length(theta),min([length(theta),40]))));%tho取40个样本
peak_num=length(findpeaks(tho));%找到极大值
xlabel([num2str(peak_num),'边形'])
end
该算法有所缺陷,检测效果不佳,有待改进。