目录
前言:
前几日处理亚太杯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;
运行结果: