图像处理边缘处理:Roberts算子和canny算子,对圆与矩阵进行识别

目录

前言:

一、Roberts算子

运行结果展示:

二、canny算子

运行结果:

三、对圆与矩阵进行识别

运行结果:



前言:

前几日处理亚太杯A题图像处理,匆忙学习了相关图片边缘处理的一些简单算子处理方法,奈何亚像素处理的水平不够。便就此搁浅,在这里简单分享一些学会的方法。

一、Roberts算子

Roberts算子是一种最简单的算子,利用局部差分算子寻找边缘的算子。采用对角线相邻两像素之差近似梯度幅值检测边缘。。检测垂直边缘的效果比斜向边缘要好,定位精度高,对噪声比较敏感,无法抑制噪声的影响。Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。

clear; 
%清空工作区变量 
I = imread('Pic1_1.bmp'); 
%读取待处理图像文件 
subplot(131),imshow(I),title('原图像'); 
%显示待处理图像文件 
image = rgb2gray(I); 
%将图片转换成灰度图像 
TempImage1 = edge ( image ,'Roberts'); 
%image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值则是由系统自适应生成的 
subplot(132),imshow(TempImage1),title('Roberts 算子'); 
%显示 Roberts 自动阈值边缘检测效果图像 
TempImage  = edge ( image ,'Roberts',0.07); 
% image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值设置为 0.07 
subplot(133),imshow(TempImage),title('Roberts 算子 阈值 0.07');

运行结果展示:

二、canny算子

anny边缘检测算法是比较出色的算法,它包含以下四个步骤:. 高斯滤波. 滤波的主要目的是降噪,一般的图像处理算法都需要先进行降噪。. 而高斯滤波主要使图像变得平滑(模糊),同时也有可能增大了边缘的宽度。. 高斯函数是一个类似与正态分布的中间大两边小的函数。. 对于一个位置(m,n)的像素点,其灰度值(这里只考虑二值图)为f (m,n)。

close all;clear all;clc;
% 提取图像轮廓,提取图像边缘
I = imread('Pic1_1.png');
c = im2bw(I,graythresh(I));
figure;
subplot(131);imshow(I);
c = flipud(c);   %实现矩阵c上下翻转
b = edge(c,'canny');
[u,v] = find(b);   %返回边界矩阵b中非零元素的位置
xp = v;  %行值v赋给xp
yp = u;  %列值u赋给yp
x0 = mean([min(xp),max(xp)]);  %x0为行值的均值
y0 = mean([min(yp),max(yp)]);  %y0为列值得均值
xp1 = xp-x0;
yp1 = yp-y0;
[cita,r] = cart2pol(xp1,yp1);
q = sortrows([cita,r]);  %从r列开始比较数值并按升序排序
cita = q(:,1);  %赋角度值
r = q(:,2);  %赋半径模值
subplot(132);polar(cita,r);  %画极坐标下的轮廓图
[x,y] = pol2cart(cita,r);
x = x+x0;
y = y+y0;
subplot(133);plot(x,y);axis equal;

运行结果:

三、对圆与矩阵进行识别

pic=imread('Pic1_1.bmp');
gray_pic=rgb2gray(pic);
binary_img=1-im2bw(pic,0.73); %灰度图转换成二值图像,直接进行灰度反转,让图形区域置1
for i=202:265
 binary_img(188,i)=1;
end
fill_hole=imfill(binary_img,'holes');
fill_hole=bwareaopen(fill_hole,10);
[B,L]=bwboundaries(fill_hole,'noholes');
out_result=regionprops(fill_hole,'Extent','Centroid','boundingbox'); %Extent:各连通区域像素点与最小边界像素点比值
centroids = cat(1, out_result.Centroid); %各连通区域质心
draw_rect=cat(1,out_result.BoundingBox); %各连通区域最小边界矩形
figure;
subplot(2,2,1);imshow(pic,[]);title('原图');
subplot(2,2,2);imshow(binary_img,[]);title('二值化');
subplot(2,2,3);imshow(fill_hole,[]);title('区域填充');
subplot(2,2,4);imshow(fill_hole,[]);title('圆和矩形检测');
hold on;
for i=1:size(out_result)
    rectangle('position',draw_rect(i,:),'EdgeColor','y','LineWidth',2); %绘出各连通区域最小边界矩形
    if out_result(i).Extent>0.95
        text(centroids(i,1)-20, centroids(i,2)-10,'矩形','Color','b','FontSize',9);
        text(centroids(i,1)-32,centroids(i,2)+10,num2str(out_result(i).Extent),'Color','b','FontSize',8);
    else
    out_result(i).Extent>0.76&&out_result(i).Extent<0.80
    text(centroids(i,1)-20, centroids(i,2)-10,'圆形','Color','b','FontSize',9);
    text(centroids(i,1)-32, centroids(i,2)+10,num2str(out_result(i).Extent/(pi/4)),'Color','b','FontSize',8);
    end
end
hold on;
for j=1:length(B)
 boundary=B{j};
 
plot(boundary(:,2),boundary(:,1),'r','LineWidth',2); 
end
hold off;

运行结果:

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靳小锅er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值