0
点赞
收藏
分享

微信扫一扫

图像处理基础-圆形和多边形检测

大明宫 2022-04-17 阅读 55
matlab

使用语言: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

该算法有所缺陷,检测效果不佳,有待改进。

举报

相关推荐

0 条评论