图像边缘检测各种算子MATLAB实现以及实际应用
canny边缘检测matlab代码
![canny边缘检测matlab代码](https://img.taocdn.com/s3/m/c87bc3220a4e767f5acfa1c7aa00b52acfc79c3a.png)
canny边缘检测matlab代码Canny边缘检测是一种常用的图像处理算法,它可以有效地检测图像中的边缘,并将其显示为白色线条。
在Matlab中,可以使用以下代码实现Canny边缘检测:1. 读取图像首先,需要读取待处理的图像。
可以使用imread函数来读取图片:```matlabimg = imread('image.jpg');```其中,image.jpg是待处理的图片文件名。
2. 灰度化Canny算法只能处理灰度图像,因此需要将彩色图像转换为灰度图像。
可以使用rgb2gray函数来实现:```matlabgray_img = rgb2gray(img);```3. 高斯滤波在进行边缘检测之前,需要对图像进行高斯滤波来消除噪声。
可以使用fspecial和imfilter函数来实现:```matlabgaussian_filter = fspecial('gaussian', [5 5], 1);blur_img = imfilter(gray_img, gaussian_filter, 'replicate');```其中,[5 5]表示高斯核的大小为5x5,1表示标准差。
4. 计算梯度幅值和方向接下来,需要计算每个像素点的梯度幅值和方向。
可以使用Sobel算子来计算梯度,并利用arctan函数计算方向角度:```matlabsobel_x = [-1 0 1; -2 0 2; -1 0 1];sobel_y = [-1 -2 -1; 0 0 0; 1 2 1];grad_x = imfilter(blur_img, sobel_x, 'replicate');grad_y = imfilter(blur_img, sobel_y, 'replicate');grad_mag = sqrt(grad_x.^2 + grad_y.^2);grad_dir = atan(grad_y ./ grad_x);```5. 非极大值抑制由于Sobel算子计算出的梯度幅值可能会有多个峰值,因此需要进行非极大值抑制来保留边缘。
实现用三种边缘检测算子对一幅图像提取边缘
![实现用三种边缘检测算子对一幅图像提取边缘](https://img.taocdn.com/s3/m/3d9f159184868762caaed5fa.png)
实现用三种边缘检测算子对一幅图像提取边缘,给出结果并分析。
用sobel,log,candy三种算子对图像进行边缘提取:f = imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\xback.jpg');f = rgb2gray(f); %将图像转化为灰度图像[gsobel_default,ts] = edge(f,'sobel');%利用sobel算子的默认语法得到边缘图像subplot(231);imshow(gsobel_default);title('g sobel default');[glog_default,tlog]=edge(f,'log');%利用log算子的默认语法得到边缘图像subplot(233);imshow(glog_default);title('g log default');[gcanny_default,tc]=edge(f,'canny');%利用candy算子的默认语法得到边缘图像subplot(235);imshow(gcanny_default);title('g canny default');gSobel_best=edge(f,'sobel',0.05);%减少不必要的细节subplot(232);imshow(gSobel_best);title('g sobel best');gLog_best=edge(f,'log',0.003,2.25);%subplot(234);imshow(gLog_best);title('g log best');gCanny_best=edge(f,'canny',[0.04 0.10],1.5);%subplot(236);imshow(gCanny_best);title('g canny best');MATLAB图像显示如下:分析如下:sobel得出的结果与试图检测边缘的目标相差太远。
基于Matlab的图像边缘检测算法的实现及应用汇总
![基于Matlab的图像边缘检测算法的实现及应用汇总](https://img.taocdn.com/s3/m/71877904227916888486d77e.png)
目录摘要 (1)引言 (2)第一章绪论 (3)1.1 课程设计选题的背景及意义 (3)1.2 图像边缘检测的发展现状 (4)第二章边缘检测的基本原理 (5)2.1 基于一阶导数的边缘检测 (8)2.2 基于二阶导的边缘检测 (9)第三章边缘检测算子 (10)3.1 Canny算子 (10)3.2 Roberts梯度算子 (11)3.3 Prewitt算子 (12)3.4 Sobel算子 (13)3.5 Log算子 (14)第四章MATLAB简介 (15)4.1 基本功能 (15)4.2 应用领域 (16)第五章编程和调试 (17)5.1 edge函数 (17)5.2 边缘检测的编程实现 (17)第六章总结与体会 (20)参考文献 (21)摘要边缘是图像最基本的特征,包含图像中用于识别的有用信息,边缘检测是数字图像处理中基础而又重要的内容。
该课程设计具体考察了5种经典常用的边缘检测算子,并运用Matlab进行图像处理结果比较。
梯度算子简单有效,LOG 算法和Canny 边缘检测器能产生较细的边缘。
边缘检测的目的是标识数字图像中灰度变化明显的点,而导函数正好能反映图像灰度变化的显著程度,因而许多方法利用导数来检测边缘。
在分析其算法思想和流程的基础上,利用MATLAB对这5种算法进行了仿真实验,分析了各自的性能和算法特点,比较边缘检测效果并给出了各自的适用范围。
关键词:边缘检测;图像处理;MATLAB仿真引言边缘检测在图像处理系统中占有重要的作用,其效果直接影响着后续图像处理效果的好坏。
许多数字图像处理直接或间接地依靠边缘检测算法的性能,并且在模式识别、机器人视觉、图像分割、特征提取、图像压缩等方面都把边缘检测作为最基本的工具。
但实际图像中的边缘往往是各种类型的边缘以及它们模糊化后结果的组合,并且在实际图像中存在着不同程度的噪声,各种类型的图像边缘检测算法不断涌现。
早在1965 年就有人提出边缘检测算子,边缘检测的传统方法包括Kirsch,Prewitt,Sobel,Roberts,Robins,Mar-Hildreth 边缘检测方法以及Laplacian-Gaussian(LOG)算子方法和Canny 最优算子方法等。
基于Sobel算子图像边缘检测的MATLAB实现
![基于Sobel算子图像边缘检测的MATLAB实现](https://img.taocdn.com/s3/m/e51e1b13cf84b9d528ea7a5b.png)
基于Sobel算子图像边缘检测的MATLAB 实现作者:吴术路来源:《电脑知识与技术》2010年第19期摘要:边缘检测在数字图像处理中有着重要的应用。
边缘是图像的最基本特征。
该文利用Sobel算子对图像进行水平和垂直的边缘提取,并对图像进行MATLAB仿真比较,仿真实验表明,该方法对图像边缘的检测精度较高,抗噪声能力强,提高了图像边缘检测效果。
关键词:边缘检测;Sobel算子;MATLAB中图分类号:TP391文献标识码:A文章编号:1009-3044(2010)19-5314-02Based on Sobel Edge Detection Operator of MATLAB ImplementationWU Shu-lu(Qinghai & TV University, Xi'ning 810008, China)Abstract: Edge detection in the digital image processing has important applications. Edge is the most basic features of the image. In this paper, Sobel operator to the image horizontal and vertical edge detection, and image comparison MATLAB simulation, simulation experiments show that the method has high precision in image detection, anti-noise ability and improving the image edge detection.Key words: edge detection; sobel operator; MATLAB边缘检测技术对于数字图像非常重要,边缘是所要提取目标和背景的边界线,提取出边缘才能将目标和背景区分开。
边缘提取和边缘检测matlab程序代码大全
![边缘提取和边缘检测matlab程序代码大全](https://img.taocdn.com/s3/m/0dd75e64f61fb7360b4c65a4.png)
附录Part1:对cameraman原始图像处理的仿真程序:clcclear allclose allA = imread('cameraman.bmp'); % 读入图像subplot(2,4,1);imshow(A);title('原图');x_mask = [1 0;0 -1]; % 建立X方向的模板y_mask = rot90(x_mask); % 建立Y方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask); % 计算Y方向的梯度分量grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像subplot(2,4,2);imshow(BW); % 显示分割后的图像即边缘图像title('Roberts');y_mask = [-1 -2 -1;0 0 0;1 2 1];x_mask = y_mask';I = im2double(A);dx = imfilter(I, x_mask);dy = imfilter(I, y_mask);grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad);level = graythresh(grad);BW = im2bw(grad,level);subplot(2,4,3);imshow(BW); % 显示分割后的图像即边缘图像title('Sobel');y_mask = [-1 -1 -1;0 0 0;1 1 1];x_mask = y_mask';dx = imfilter(I, x_mask);dy = imfilter(I, y_mask);grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad);level = graythresh(grad);BW = im2bw(grad,level); % 用阈值分割梯度图像subplot(2,4,4);imshow(BW); % 显示分割后的图像即边缘图像title('Prewitt');mask=[0,-1,0;-1,4,-1;0,-1,0]; % 建立模板dx = imfilter(I, mask); % 计算梯度矩阵grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像BW = im2bw(grad,0.58); % 用阈值分割梯度图像subplot(2,4,5);imshow(BW); % 显示分割后的图像,即梯度图像title('Laplacian');mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0]; % 建立模板dx = imfilter(I, mask); % 计算梯度矩阵grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像BW = im2bw(grad,0.58);subplot(2,4,6);imshow(BW); % 显示分割后的图像,即梯度图像title('log');BW1 = edge(I,'canny'); % 调用canny函数subplot(2,4,7);imshow(BW1); % 显示分割后的图像,即梯度图像title('Canny');mask1=[-1 -2 -1;0 0 0;1 2 1]; % 建立方向模板mask2=[-2 -1 0;-1 0 1;0 1 2];mask3=[-1 0 1;-2 0 2;-1 0 1];mask4=[0 1 2;-1 0 1;-2 -1 0];mask5=[1 2 1;0 0 0;-1 -2 -1];mask6=[2 1 0;1 0 -1;0 -1 -2];mask7=[1 0 -1;2 0 -2;1 0 -1];mask8=[0 -1 -2;1 0 -1;2 1 0];d1 = imfilter(I, mask1); % 计算8个领域的灰度变化d2 = imfilter(I, mask2);d3 = imfilter(I, mask3);d4 = imfilter(I, mask4);d5 = imfilter(I, mask5);d6 = imfilter(I, mask6);d7 = imfilter(I, mask7);d8 = imfilter(I, mask8);dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵dd = max(dd,abs(d3));dd = max(dd,abs(d4));dd = max(dd,abs(d5));dd = max(dd,abs(d6));dd = max(dd,abs(d7));dd = max(dd,abs(d8));grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像BB = grad;FW=median(BB(:))/0.6745;B = BB.*BB;B = sum(B(:));FX= sqrt(B/256^2);FS=sqrt(max(FX^2-FW^2,0));T=sqrt(2)*FW^2/FS; % 计算最佳阈值grad = mat2gray(BB);BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2); % 显示分割后的图像,即边缘图像title('sobel改进算子');Part2加入高斯噪声后的cameraman仿真程序:clcclear allclose allA = imread('cameraman.bmp'); % 读入图像V=0.009;X=imnoise(A,'gaussian',0,V);subplot(2,4,1);imshow(X);%添加均值为0、方差0.09的高斯噪声x_mask = [1 0;0 -1]; % 创建X方向的模板y_mask = rot90(x_mask); % 创建Y方向的模板I = im2double(X); % 图像数据双精度转化dx = imfilter(I, x_mask); % X方向的梯度分量的计算dy = imfilter(I, y_mask); % Y方向的梯度分量的计算grad = sqrt(dx.*dx + dy.*dy); % 梯度计算grad = mat2gray(grad); % 梯度矩阵转换成灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 使用阈值分割梯度图像subplot(2,4,2);imshow(BW); % 显示分割后的图像即边缘图像title('Roberts');y_mask = [-1 -2 -1;0 0 0;1 2 1];x_mask = y_mask';dx = imfilter(I, x_mask);dy = imfilter(I, y_mask);grad = sqrt(dx.*dx + dy.*dy);grad = mat2gray(grad); % 梯度矩阵转为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像subplot(2,4,3);imshow(BW); % 显示分割后的图像即边缘图像title('Sobel');y_mask = [-1 -1 -1;0 0 0;1 1 1];x_mask = y_mask';dx = imfilter(I, x_mask);dy = imfilter(I, y_mask);grad = sqrt(dx.*dx + dy.*dy);grad = mat2gray(grad);level = graythresh(grad);BW = im2bw(grad,level);subplot(2,4,4);imshow(BW); % 显示分割后的图像即边缘图像title('Prewitt');mask=[0,-1,0;-1,4,-1;0,-1,0]; % 建立模板dx = imfilter(I, mask); % 计算梯度矩阵grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像BW = im2bw(grad,0.58); % 用阈值分割梯度图像subplot(2,4,5);imshow(BW); % 显示分割后的图像,即梯度图像title('Laplacian');mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0]; % 建立模板dx = imfilter(I, mask); % 计算梯度矩阵grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像BW = im2bw(grad,0.58); % 用阈值分割梯度图像subplot(2,4,6);imshow(BW); % 显示分割后的图像,即梯度图像title('log');BW1 = edge(I,'canny'); % 调用canny函数subplot(2,4,7);imshow(BW1); % 显示分割后的图像,即梯度图像title('Canny');mask1=[-1 -2 -1;0 0 0;1 2 1]; % 建立方向模板mask2=[-2 -1 0;-1 0 1;0 1 2];mask3=[-1 0 1;-2 0 2;-1 0 1];mask4=[0 1 2;-1 0 1;-2 -1 0];mask5=[1 2 1;0 0 0;-1 -2 -1];mask6=[2 1 0;1 0 -1;0 -1 -2];mask7=[1 0 -1;2 0 -2;1 0 -1];mask8=[0 -1 -2;1 0 -1;2 1 0];d1 = imfilter(I, mask1); % 计算8个领域的灰度变化d2 = imfilter(I, mask2);d3 = imfilter(I, mask3);d4 = imfilter(I, mask4);d5 = imfilter(I, mask5);d6 = imfilter(I, mask6);d7 = imfilter(I, mask7);d8 = imfilter(I, mask8);dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵dd = max(dd,abs(d3));dd = max(dd,abs(d4));dd = max(dd,abs(d5));dd = max(dd,abs(d6));dd = max(dd,abs(d7));dd = max(dd,abs(d8));grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像BB = grad;FW=median(BB(:))/0.6745;B = BB.*BB;B = sum(B(:));FX= sqrt(B/256^2);FS=sqrt(max(FX^2-FW^2,0));T=sqrt(2)*FW^2/FS; % 计算最佳阈值grad = mat2gray(BB); % 将梯度矩阵转化为灰度图像BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2); % 显示分割后的图像,即边缘图像title('sobel改进算子');加入椒盐噪声的边缘检测程序:function jingdianI=imread('lenna.bmp');I1=imnoise(I,'salt & pepper');%添加椒盐噪声,默认值为0.02 figure,imshow(I1);%添加均值为0、方差0.002的高斯噪声title('添加椒盐噪声后原图')B1=edge(I1,'roberts');B2=edge(I1,'sobel');B3=edge(I1,'prewitt');B4=edge(I1,'canny');B5=edge(I1,'log');subplot(2,3,1);imshow(B1);title('roberts算子检测');subplot(2,3,2);imshow(B2);title('sobel算子检测');subplot(2,3,3);imshow(B3);title('prewitt算子检测');subplot(2,3,4);imshow(B4);title('canny算子检测');subplot(2,3,5)imshow(B5);title('log算子检测');B1=edge(I1,'roberts');%调用roberts算子检测图像B2=edge(I1,'sobel');%调用soble算子进行边缘检测B3=edge(I1,'prewitt');%调用prewitt算子进行边缘检测B4=edge(I1,'canny');%调用canny算子对图像进行边缘检测B5=edge(I1,'log');%调用log算子对图像进行边缘检测subplot(2,3,1);%设置图像布局imshow(B1);title('roberts算子检测');%现实图像并命名为roberts算子检测subplot(2,3,2);imshow(B2);title('sobel算子检测');subplot(2,3,3);imshow(B3);title('prewitt算子检测');subplot(2,3,4);imshow(B4);title('canny算子检测');subplot(2,3,5)imshow(B5);title('log算子检测');mask1=[-1 -2 -1;0 0 0;1 2 1]; % 建立方向模板mask2=[-2 -1 0;-1 0 1;0 1 2];mask3=[-1 0 1;-2 0 2;-1 0 1];mask4=[0 1 2;-1 0 1;-2 -1 0];mask5=[1 2 1;0 0 0;-1 -2 -1];mask6=[2 1 0;1 0 -1;0 -1 -2];mask7=[1 0 -1;2 0 -2;1 0 -1];mask8=[0 -1 -2;1 0 -1;2 1 0];I = im2double(I1); % 将数据图像转化为双精度d1 = imfilter(I, mask1); % 计算8个领域的灰度变化d2 = imfilter(I, mask2);d3 = imfilter(I, mask3);d4 = imfilter(I, mask4);d5 = imfilter(I, mask5);d6 = imfilter(I, mask6);d7 = imfilter(I, mask7);d8 = imfilter(I, mask8);dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵dd = max(dd,abs(d3));dd = max(dd,abs(d4));dd = max(dd,abs(d5));dd = max(dd,abs(d6));dd = max(dd,abs(d7));dd = max(dd,abs(d8));grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像BB = grad;FW=median(BB(:))/0.6745;B = BB.*BB;B = sum(B(:));FX= sqrt(B/256^2);FS=sqrt(max(FX^2-FW^2,0));T=sqrt(2)*FW^2/FS; % 计算最佳阈值grad = mat2gray(BB); % 将梯度矩阵转化为灰度图像BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,3,6);imshow(BW2); % 显示分割后的图像,即边缘图像title('加入椒盐噪声的sobel改进算子');。
Matlab多种图像边缘检测方法
![Matlab多种图像边缘检测方法](https://img.taocdn.com/s3/m/22bd32b9c77da26925c5b084.png)
Matlab多种图像边缘检测方法1、用Prewitt算子检测图像的边缘I = imread('bacteria.BMP');BW1 = edge(I,'prewitt',0.04); % 0.04为梯度阈值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子检测图像的边缘I = imread('bacteria.BMP');BW1 = edge(I,'log',0.003); % σ=2imshow(BW1);title('σ=2')BW1 = edge(I,'log',0.003,3); % σ=3figure, imshow(BW1);title('σ=3')3、用Canny算子检测图像的边缘I = imread('bacteria.BMP');imshow(I);BW1 = edge(I,'canny',0.2);figure,imshow(BW1);4、图像的阈值分割I=imread('blood1.tif');imhist(I); % 观察灰度直方图,灰度140处有谷,确定阈值T=140I1=im2bw(I,140/255); % im2bw函数需要将灰度值转换到[0,1]范围内figure,imshow(I1);5、用水线阈值法分割图像afm = imread('afmsurf.tif');figure, imshow(afm);se = strel('disk', 15);Itop = imtophat(afm, se); % 高帽变换Ibot = imbothat(afm, se); % 低帽变换figure, imshow(Itop, []); % 高帽变换,体现原始图像的灰度峰值figure, imshow(Ibot, []); % 低帽变换,体现原始图像的灰度谷值Ienhance = imsubtract(imadd(Itop, afm), Ibot);% 高帽图像与低帽图像相减,增强图像figure, imshow(Ienhance);Iec = imcomplement(Ienhance); % 进一步增强图像Iemin = imextendedmin(Iec, 20); figure,imshow(Iemin) % 搜索Iec中的谷值Iimpose = imimposemin(Iec, Iemin);wat = watershed(Iimpose); % 分水岭分割rgb = label2rgb(wat); figure, imshow(rgb); % 用不同的颜色表示分割出的不同区域6、对矩阵进行四叉树分解I = [ 1 1 1 1 2 3 6 61 12 1 4 5 6 81 1 1 1 10 15 7 71 1 1 1 20 25 7 720 22 20 22 1 2 3 420 22 22 20 5 6 7 820 22 20 20 9 10 11 1222 22 20 20 13 14 15 16];S = qtdecomp(I,5);full(S)7、将图像分为文字和非文字的两个类别I=imread('4-11.jpg');I1=I(:,:,1);I2=I(:,:,2);I3=I(:,:,3);[y,x,z]=size(I);d1=zeros(y,x);d2=d1;myI=double(I);I0=zeros(y,x);for i=1:xfor j=1:y%欧式聚类d1(j,i)=sqrt((myI(j,i,1)-180)^2+(myI(j,i,2)-180)^2+(myI(j,i,3)-180)^2);d2(j,i)=sqrt((myI(j,i,1)-200)^2+(myI(j,i,2)-200)^2+(myI(j,i,3)-200)^2);if (d1(j,i)>=d2(j,i))I0(j,i)=1;endendendfigure(1);imshow(I);% 显示RGB空间的灰度直方图,确定两个聚类中心(180,180,180)和(200,200,200) figure(2);subplot(1,3,1);imhist(I1);subplot(1,3,2);imhist(I2);subplot(1,3,3);imhist(I3);figure(4);imshow(I0);8、形态学梯度检测二值图像的边缘I=imread('wrod213.bmp');imshow(I);I=~I; % 腐蚀运算对灰度值为1的进行figure, imshow(I);SE=strel('square',3); % 定义3×3腐蚀结构元素J=imerode(~I,SE);BW=(~I)-J; % 检测边缘figure,imshow(BW);9、形态学实例——从PCB图像中删除所有电流线,仅保留芯片对象I=imread('circbw.tif');imshow(I);SE=strel('rectangle',[40 30]); % 结构定义J=imopen(I,SE); % 开启运算figure,imshow(。
Matlab实现:图像边缘提取
![Matlab实现:图像边缘提取](https://img.taocdn.com/s3/m/a8369f15cd1755270722192e453610661ed95a88.png)
Matlab实现:图像边缘提取1、边缘提取算法⽅法⼀:⼀阶微分算⼦Sobel算⼦Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,Sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素。
Roberts算⼦Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确。
Prewitt算⼦Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。
但边缘较宽,⽽且间断点多。
Canny算⼦Canny算⼦是⽬前边缘检测最常⽤的算法,效果也是最理想的。
Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。
优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
⽅法⼆:⼆阶微分算⼦Laplacian算⼦Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区。
2、实验结果分析⼀、边缘提取:Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素;Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确;Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。
但边缘较宽,⽽且间断点多;Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区;Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。
优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
⼆、边缘复合增强Sobel、Robert、Prewitt算⼦的增强效果并不是很明显,尤其是Robert算⼦,因为它提取的边缘点过于稀疏和离散;Laplacian算⼦和canny算⼦的增强效果都⽐较理想,将边缘叠加上去后,整个⼿的轮廓和边缘都很清晰,直观上看,canny算⼦实现的效果⽐Laplacian算⼦好,最明显的地⽅就是⼿指尖的边缘。
基于matlab的图像边缘检测算法研究和仿真设计
![基于matlab的图像边缘检测算法研究和仿真设计](https://img.taocdn.com/s3/m/1fbdd749a76e58fafab00399.png)
基于matlab的图像边缘检测算法研究和仿真目录第1章绪论 11.1 序言 11.2 数字图像边缘检测算法的意义 1第2章传统边缘检测方法及理论基础 2 2.1 数字图像边缘检测的现状与发展 22.2 MATLAB和图像处理工具箱的背景知识 32.3 数字图像边缘检测关于边缘的定义 42.4 基于一阶微分的边缘检测算子 42.5 基于二阶微分的边缘检测算子 7第3章编程和调试 103.1 edge函数 103.2 边缘检测的编程实现 11第4章总结 13第5章图像边缘检测应用领域 13附录参考文献 15第1章绪论§1.1 序言理解图像和识别图像中的目标是计算机视觉研究的中心任务,物体形状、物体边界、位置遮挡、阴影轮廓及表面纹理等重要视觉信息在图像中均有边缘产生。
图像边缘是分析理解图像的基础,它是图像中最基本的特征。
在Marr的计算机视觉系统中,图像边缘提取占据着非常重要位置,它位于系统的最底层,为其它模块所依赖。
图像边缘提取作为计算机视觉领域最经典的研究课题,长期受到人们的重视。
图像边缘主要划分为阶跃状和屋脊状两种类型。
阶跃状边缘两侧的灰度值变化明显,屋脊状边缘则位于灰度增加与减少的交界处。
传统的图像边缘检测方法大多是从图像的高频分量中提取边缘信息,微分运算是边缘检测与提取的主要手段。
由于传统的边缘检测方法对噪声敏感,所以实际运用效果有一定的局限性。
近年来,越来越多的新技术被引入到边缘检测方法中,如数学形态学、小波变换、神经网络和分形理论等。
Canny于1986年提出基于最优化算法的边缘检测算子,得到了广泛的应用,并成了与其它实验结果作比较的标准。
其原因在于他最先建立了优化边缘检测算子的理论基础,提出了迄今为止定义最为严格的边缘检测的三个标准。
另外其相对简单的算法使得整个过程可以在较短的时间实现。
实验结果也表明,Canny算子在处理受加性高斯白噪声污染的图像方面获得了良好的效果[1]。
roberts梯度算子的matlab程序
![roberts梯度算子的matlab程序](https://img.taocdn.com/s3/m/9288b2c682d049649b6648d7c1c708a1284a0a8d.png)
在机器学习和图像处理领域,Roberts梯度算子是一种常用的边缘检测算法。
它可以帮助我们在图像中快速准确地找到边缘位置,对于图像分割和特征提取等任务非常有用。
在本文中,我将重点介绍Roberts梯度算子的matlab程序,以及它在图像处理中的应用。
1. Roberts梯度算子的原理Roberts梯度算子是一种基于差分的边缘检测方法,它利用了图像中像素点的灰度值之间的变化来检测边缘。
具体来说,Roberts算子使用了两个3x3的卷积核:$$\begin{bmatrix}1 & 0 & 0\\0 & -1 & 0\\0 & 0 & 0\end{bmatrix}和\begin{bmatrix}0 & 1 & 0\\-1 & 0 & 0\\0 & 0 & 0\end{bmatrix}$$分别对图像进行卷积运算,然后将它们的平方和再开方得到边缘检测结果。
这种方法可以很好地捕捉到图像灰度值的变化,从而找到图像中的边缘。
2. Roberts梯度算子的matlab程序下面是一个简单的Roberts梯度算子的matlab程序示例:```matlabfunction [edge_image] = roberts_edge_detection(image)[m, n] = size(image);edge_image = zeros(m, n);for i = 1 : m - 1for j = 1 : n - 1% 对图像进行卷积运算edge_image(i, j) = abs(image(i, j) - image(i+1, j+1)) + abs(image(i, j+1) - image(i+1, j));endendend```这段matlab代码实现了对图像的Roberts边缘检测。
首先读入图像,然后对每个像素点进行Roberts算子的卷积运算,最后得到一个边缘图像。
matlab卷积提取边缘实例
![matlab卷积提取边缘实例](https://img.taocdn.com/s3/m/3c70dfabb9f67c1cfad6195f312b3169a451ea8e.png)
当谈到图像处理和边缘检测时,Matlab中的卷积技术无疑是一个非常有用且强大的工具。
在本文中,我将探讨Matlab中卷积提取边缘的实例,以及如何利用这一技术来实现高质量的图像处理。
我将从简单的概念和原理开始,逐步深入,帮助您更好地理解这一主题。
1. 初识卷积在图像处理中,卷积是一种非常重要的数学运算。
通过卷积,可以在图像中提取出一些特定的信息,比如边缘、纹理等。
在Matlab中,我们可以使用conv2函数来进行二维卷积运算。
这个函数非常灵活,可以对图像进行各种滤波操作。
2. 边缘检测边缘是图像中的一个非常重要的特征,常常被用来进行目标检测和识别。
在Matlab中,我们可以利用卷积来提取图像中的边缘信息。
常见的边缘检测算子包括Sobel、Prewitt、Canny等。
这些算子利用卷积的原理,通过对图像进行滤波,可以有效地提取出图像中的边缘信息。
3. 实例演示接下来,我将通过一个实例来演示如何在Matlab中利用卷积来提取图像中的边缘。
我们需要加载一张待处理的图像,并将其转化为灰度图像。
我们可以利用conv2函数和Sobel算子来对图像进行卷积操作,从而提取出图像中的边缘。
4. 结果展示通过卷积提取边缘后,我们可以将处理前后的图像进行对比,以展示卷积技术在边缘提取中的有效性。
我们也可以通过调整卷积核的参数,来观察其对边缘检测结果的影响。
这样可以帮助我们更好地理解卷积在边缘检测中的作用。
5. 个人观点在我看来,Matlab中的卷积技术在图像处理领域中具有非常重要的意义。
通过卷积,我们可以有效地提取图像中的各种特征信息,包括边缘、纹理等。
而且,Matlab提供了非常丰富和灵活的函数库,使得我们可以很方便地进行各种卷积操作。
我认为掌握卷积技术对于图像处理领域的学习和应用是非常重要的。
总结回顾通过本文的介绍,我希望您能对Matlab中卷积提取边缘的实例有一个更全面、深刻和灵活的理解。
我们从卷积的概念开始,介绍了卷积在边缘检测中的重要性,并通过实例演示和结果展示,帮助您更直观地理解了卷积在图像处理中的应用。
Sobel、Prewitt、Roberts算子的边缘检测
![Sobel、Prewitt、Roberts算子的边缘检测](https://img.taocdn.com/s3/m/838fb203c5da50e2524d7ff2.png)
实验3 边缘检测一、实验目的1、掌握差分算法(1阶和2阶)2、理解canny算子二、实验内容使用Matlab或者VC实现下面几个内容1、(一阶差分)实现分别采用Sobel、Prewitt、Roberts算子的边缘检测。
可以采用公式法,也可以采用模板法。
2、(二阶差分)实现分用zerocross(也称过零检测、Laplacian)边缘检测3、实现图像卷积的空域与频域算法4、利用Matlab实现canny算子三、实验程序1.(一阶差分)%% Sobel算子clear;sourcePic=imread('111.jpg');%读取原图像grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素sobelNum=0;%经sobel算子计算得到的每个像素的值sobelThreshold=0.8;%设定阈值for j=2:m-1 %进行边界提取for k=2:n-1sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)- ..., grayPic(j-1,k-1)-2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs( ...,grayPic(j-1,k-1)+2*grayPic(j-1,k)+grayPic(j-1,k+1)-grayPic(j+1,k-1) ...,-2*grayPic(j+1,k)-grayPic(j+1,k+1));if(sobelNum > sobelThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('Sobel算子的处理结果')%% Prewitt算子clear;sourcePic=imread('111.jpg');%读取原图像grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素PrewittNum=0;%经Prewitt算子计算得到的每个像素的值PrewittThreshold=0.5;%设定阈值for j=2:m-1 %进行边界提取for k=2:n-1PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k) ...,-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs ...,(grayPic(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1) ...,-grayPic(j,k-1)-grayPic(j+1,k-1));if(PrewittNum > PrewittThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('Prewitt算子的处理结果')%% Roberts算子clear;sourcePic=imread('111.jpg'); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=0.2; %设定阈值for j=1:m-1 %进行边界提取for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));if(robertsNum > robertThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('roberts算子的处理结果')2.(2阶算子)I=imread('111.jpg'); %读取图像I1=im2double(I); %将彩图序列变成双精度I2=rgb2gray(I1); %将彩色图变成灰色图[thr, sorh, keepapp]=ddencmp('den','wv',I2);I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪I4=medfilt2(I3,[9 9]); %中值滤波I5=imresize(I4,0.8,'bicubic'); %图像大小h=fspecial('gaussian',5); %高斯滤波BW=edge(I5,'zerocross',[ ],h); %zerocross 图像边缘提取figure;imshow(BW);title('Zerocross');3.图像卷积的空域与时域算法inimg = imread('cameraman.tif');subplot(131)imshow(inimg), title('Original image')[M,N] = size(inimg); % Original image size%====================================================================h = fspecial('gaussian',25,4); % Gaussian filter%====================================================================% 空域滤波gx = imfilter(inimg,h,'same','replicate'); % 空域图像滤波subplot(132)imshow(gx,[]);title('Spatial domain filtering')%====================================================================% 频域滤波%====================================================================h_hf = floor(size(h)/2); % 空域滤波器半高/宽imgp = padarray(inimg, [h_hf(1),h_hf(2)],'replicate'); % Padding boundary with copying pixelsPQ = 2*size(imgp);Fp = fft2(double(imgp), PQ(1), PQ(2)); % 延拓图像FFTP = PQ(1); Q = PQ(2);center_h = h_hf+1; % 空域小模板h中心位置hp = zeros(P,Q); % 预分配内存,产生P×Q零矩阵hp(1:size(h,1),1:size(h,2)) = h; % h置于hp左上角hp = circshift(hp,[-(center_h(1)-1),-(center_h(2)-1)]); % 循环移位,h中心置于hp左上角%====================================================================Hp = fft2(double(hp)); % hp滤波器做FFT%====================================================================Gp = Hp.*Fp; % 频域滤波gp = real(ifft2(Gp)); % 反变换,取实部gf = gp(h_hf(1)+1:M+ h_hf(1), h_hf(2)+1:N + h_hf(2)); % 截取有效数据subplot(133)imshow(uint8(gf),[]), title('Frequency domain filtering')% 注:以上处理中,频域图像Fp与滤波器Hp均未中心化,因此,返回空域时无需反中心化。
matlab边缘检测代码
![matlab边缘检测代码](https://img.taocdn.com/s3/m/ab980ae2cf2f0066f5335a8102d276a200296085.png)
MATLAB边缘检测代码边缘检测是图像处理中常用的技术,用于识别图像中物体的轮廓。
在MATLAB中,我们可以使用不同的方法进行边缘检测,例如Sobel算子、Canny算子等。
本文将介绍MATLAB中常用的边缘检测方法,并给出相应的代码示例。
1. Sobel算子Sobel算子是一种基于梯度的边缘检测算法,通过计算图像灰度值的一阶导数来识别边缘。
在MATLAB中,我们可以使用edge函数来实现Sobel算子。
img = imread('image.jpg'); % 读取图像gray_img = rgb2gray(img); % 将彩色图像转换为灰度图像edge_img = edge(gray_img, 'sobel'); % 使用Sobel算子进行边缘检测imshow(edge_img); % 显示结果上述代码首先读取一张彩色图像,并将其转换为灰度图像。
然后使用edge函数对灰度图像进行Sobel边缘检测,并将结果显示出来。
2. Canny算子Canny算子是一种基于多阶段处理的边缘检测算法,它能够有效地抑制噪声并提取出清晰、准确的边缘。
在MATLAB中,我们同样可以使用edge函数来实现Canny算子。
img = imread('image.jpg'); % 读取图像gray_img = rgb2gray(img); % 将彩色图像转换为灰度图像edge_img = edge(gray_img, 'canny'); % 使用Canny算子进行边缘检测imshow(edge_img); % 显示结果上述代码与Sobel算子的示例代码类似,只是将edge函数的第二个参数设置为'canny'来使用Canny算子进行边缘检测。
3. Laplacian算子Laplacian算子是一种基于二阶导数的边缘检测算法,它能够检测出图像中的灰度变化区域。
Matlab在图像处理中的应用与技巧
![Matlab在图像处理中的应用与技巧](https://img.taocdn.com/s3/m/e92a775e9a6648d7c1c708a1284ac850ac020465.png)
Matlab在图像处理中的应用与技巧引言图像处理是计算机科学领域中的一个重要分支,通过对图像进行处理和分析,可以获得许多有价值的信息。
而MATLAB作为一个强大的计算软件,具备了丰富的图像处理函数和工具箱,可以帮助我们实现各种复杂的图像处理任务。
本文将介绍MATLAB在图像处理中的应用与技巧,帮助读者更好地利用MATLAB进行图像处理。
一、图像的读取与显示在MATLAB中,可以使用imread函数读取图像文件。
例如,要读取一张名为"image.jpg"的图像文件,可以使用以下代码:```MATLABimage = imread('image.jpg');```而imshow函数则可以将图像显示在窗口中,例如:```MATLABimshow(image);```通过这两个简单的函数,我们可以很方便地读取和显示图像。
二、图像的基本处理1.图像的缩放在图像处理过程中,经常需要将图像进行缩放。
MATLAB提供了imresize函数来实现图像的缩放,例如:```MATLABnew_image = imresize(image, [height, width]);```其中,height和width分别表示缩放后图像的高度和宽度。
2.图像的灰度化有时候我们只关注图像的亮度信息,而忽略了彩色信息。
此时可以将图像转换为灰度图像,MATLAB提供了rgb2gray函数来实现图像的灰度化,例如:```MATLABgray_image = rgb2gray(image);```gray_image即为灰度图像。
3.图像的旋转有时候我们需要将图像进行旋转,MATLAB提供了imrotate函数来实现图像的旋转,例如:```MATLABrotated_image = imrotate(image, angle);```其中,angle表示旋转的角度。
三、图像的增强处理1.图像的边缘检测在许多图像处理任务中,边缘是重要的特征之一。
基于MATLAB的数字图像边缘检测算子的实验对比研究
![基于MATLAB的数字图像边缘检测算子的实验对比研究](https://img.taocdn.com/s3/m/c4dbb11c14791711cc7917d6.png)
的存 在 ,根 据 二 阶 导 数 的 幅 度 变 化 情 况 可 以确 定 边 缘 的位 置 。 于数 字 图像 来 说 , 常利 用 差 分 来 近 似 微 分 进 行 计 算 。 对 通
( 梯 度 算子 一)
对 于数 字 图 像 , 度 是 一 阶 导 数 的 二 维 等 效 形 式 . 梯 因此 通 过 求 取 梯 度 可 以判 断 边 缘 点 。 对 于 一 个 连 续 函数
、
常 用 边 缘 检 测 算 子 的 理 论 分 析
图像 的边 缘 是 图像 的基 本 特 征 之 一 , 人们 对 目标 的识 别
= G+ : l l /:G 、
。 y= rt f G ,)ac nG / a
( 2 )
() 3
主要是依靠边缘 。 图像 的边 缘 就 是 指 图像 灰 度 发 生 空 间突 变 的像 素 的集 合 。灰 度 的 突 变 一 般 常 用 导数 来 描 述 和检 测 。常
基 于 M ATLAB 的 数 字 图 像 边 缘 检 测
算 子 的 实 验 对 比 研 究
农 海 啸
( 宁 师 范 高 等 专科 学校 南 摘 数 学 与计 算机 科 学 系 , 西 广 崇左 52 0 ) 32 0 要 : 字 图像 处理 中几 种 常 见 的 边 缘 检 测 算 子 , 过 MA A 进 行 实现 ; 个 算 子 的 边 缘 检 测 效 果及 抗 噪 能 力 分 析 , 出 了各 自的优 数 通 TL B 各 得
a i t fe c pe ao r n z d t lr y t d a t g sa d d s d a t g sa d t e s o e o p h a o . b l y o a h o r t ra e a dy e o cai i f he a v n a e n i v a n a e n h c p fa p c t n i Ke r s i a e p o e s g d e d t c o ;o r t r;M ATL y wo d : m g r c si ;e g ee t n pe ao s n i AB
sobel算子检测边缘 matlab编程
![sobel算子检测边缘 matlab编程](https://img.taocdn.com/s3/m/0106b83f178884868762caaedd3383c4bb4cb437.png)
在MATLAB中,使用Sobel算子检测图像边缘的一个基本例子可以如下:matlab复制代码% 读取图像I = imread('your_image.jpg');% 转换为灰度图像I_gray = rgb2gray(I);% 使用Sobel算子进行边缘检测BW = edge(I_gray,'sobel');% 显示原图像和边缘检测后的图像figure,subplot(1,2,1), imshow(I), title('原图像')subplot(1,2,2), imshow(BW), title('Sobel边缘检测后的图像')在上述代码中,首先读取一个图像,然后将其转换为灰度图像。
然后,使用MATLAB 内置的edge函数,指定'sobel'作为方法参数,对灰度图像进行边缘检测。
最后,显示原始图像和经过Sobel边缘检测后的图像。
注意:你需要将'your_image.jpg'替换为你想要处理的图像的文件名。
如果该文件不在MATLAB的当前工作目录中,你需要提供完整的文件路径。
如果你想自己实现Sobel算子而不是使用内置的edge函数,你可以创建一个Sobel算子,然后将其应用于图像。
这是一个基本的例子:matlab复制代码% 读取图像I = imread('your_image.jpg');% 转换为灰度图像I_gray = rgb2gray(I);% 定义Sobel算子Gx = [-101; -202; -101]; % x方向Gy = [121; 000; -1-2-1]; % y方向% 计算图像大小[height, width] = size(I_gray);% 初始化输出图像Ix = zeros(height-2, width-2);Iy = zeros(height-2, width-2);I_edge = zeros(height-2, width-2);% 应用Sobel算子for i = 2:height-1for j = 2:width-1Ix(i-1,j-1) = sum(sum(double(I_gray(i-1:i+1,j-1:j+1)) .* Gx));Iy(i-1,j-1) = sum(sum(double(I_gray(i-1:i+1,j-1:j+1)) .* Gy));% 计算梯度幅度I_edge(i-1,j-1) = sqrt(Ix(i-1,j-1)^2 + Iy(i-1,j-1)^2);endend% 二值化图像BW = I_edge > threshold; % threshold是一个阈值,你需要自己设定% 显示原图像和边缘检测后的图像figure,subplot(1,2,1), imshow(I), title('原图像')subplot(1,2,2), imshow(BW), title('Sobel边缘检测后的图像')注意:在这个例子中,你需要自己设定一个阈值(threshold)来决定哪些像素被视为边缘。
matlab-图像处理-边缘检测算法五种
![matlab-图像处理-边缘检测算法五种](https://img.taocdn.com/s3/m/b039194e302b3169a45177232f60ddccdb38e651.png)
matlab-图像处理-边缘检测算法五种五种实现matlab边缘检测算法:⽅法⼀:matlab⾃带的edge函数:将图⽚保存为lena.jpgI=imread('lena.jpg');%提取图像img=rgb2gray(I);[m,n]=size(img);BW1=edge(img,'sobel'); %⽤Sobel算⼦进⾏边缘检测BW2=edge(img,'roberts');%⽤Roberts算⼦进⾏边缘检测BW3=edge(img,'prewitt'); %⽤Prewitt算⼦进⾏边缘检测BW4=edge(img,'log'); %⽤Log算⼦进⾏边缘检测BW5=edge(img,'canny'); %⽤Canny算⼦进⾏边缘检测h=fspecial('gaussian',5);%?⾼斯滤波BW6=edge(img,'canny');%⾼斯滤波后使⽤Canny算⼦进⾏边缘检测subplot(2,3,1), imshow(BW1);title('sobel edge check');subplot(2,3,2), imshow(BW2);title('roberts edge check');subplot(2,3,3), imshow(BW3);title('prewitt edge check');subplot(2,3,4), imshow(BW4);title('log edge check');subplot(2,3,5), imshow(BW5);title('canny edge check');subplot(2,3,6), imshow(BW6);title('gasussian&canny edge check'); 效果如下图所⽰:⽅法⼆:Laplacian算法clear;sourcePic=imread('lena.jpg');%图像读⼊grayPic=mat2gray(sourcePic);%实现图像的矩阵归⼀化操作[m,n]=size(grayPic);newGrayPic=grayPic;LaplacianNum=0;%经Laplacian操作得到的每个像素的值LaplacianThreshold=0.2;%设定阈值for j=2:m-1 %进⾏边界提取for k=2:n-1LaplacianNum=abs(4*grayPic(j,k)-grayPic(j-1,k)-grayPic(j+1,k)-grayPic(j,k+1)-grayPic(j,k-1));if(LaplacianNum > LaplacianThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('Laplacian算⼦的处理结果') 效果图如下:⽅法三:Prewitt算法%Prewitt 算⼦的实现:clear;sourcePic=imread('lena.jpg');grayPic=mat2gray(sourcePic);[m,n]=size(grayPic);newGrayPic=grayPic;PrewittNum=0;PrewittThreshold=0.5;%设定阈值for j=2:m-1 %进⾏边界提取for k=2:n-1PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1)); if(PrewittNum > PrewittThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('Prewitt算⼦的处理结果') 效果图如下:⽅法四:Sobel算法%Sobel 算⼦的实现:clear;sourcePic=imread('lena.jpg');grayPic=mat2gray(sourcePic);[m,n]=size(grayPic);newGrayPic=grayPic;sobelNum=0;sobelThreshold=0.7;for j=2:m-1for k=2:n-1sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1)); if(sobelNum > sobelThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('Sobel算⼦的处理结果') 效果如下:⽅法五:Roberts 算⼦的实现%Roberts 算⼦的实现:clear all;clc;sourcePic=imread('lena.jpg');grayPic=mat2gray(sourcePic);[m,n]=size(grayPic);newGrayPic=grayPic;robertsNum=0;robertThreshold=0.2;for j=1:m-1for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1)); if(robertsNum > robertThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendfigure,imshow(newGrayPic);title('roberts算⼦的处理结果') 效果图:。
基于matlab的图像边缘检测原理及应用
![基于matlab的图像边缘检测原理及应用](https://img.taocdn.com/s3/m/e21073d726fff705cc170a3d.png)
目录一.前言----------------------------------------- 二.边缘检测的与提取-----------------------1.边缘检测的定义---------------------------2.图像边缘检测算法的研究内容---------3.边缘检测算子------------------------------3.1.Sobel算子-----------------------------3.2.Canny算子----------------------------4.基于Matlab的实验结果与分析--------- 三.图像边缘检测的应用---------------------一.前言在实际图像边缘检测问题中,图像的边缘作为图像的一种基本特征,经常被应用到较高层次的图像应用中去。
它在图像识别,图像分割,图像增强以及图像压缩等的领域中有较为广泛的应用,也是它们的基础。
图像边缘是图像最基本的特征之一,往往携带着一幅图像的大部分信息。
而边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置,这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。
而边缘检测算法则是图像边缘检测问题中经典技术难题之一,它的解决对于我们进行高层次的特征描述、识别和理解等有着重大的影响;又由于边缘检测在许多方面都有着非常重要的使用价值,所以人们一直在致力于研究和解决如何构造出具有良好性质及好的效果的边缘检测算子的问题。
该课程设计具体考察了两种最常用的边缘检测算子并运用MATLAB进行图像处理比较。
二.边缘检测于算子1.边缘检测的定义图像边缘是图像最基本的特征,边缘在图像分析中起着重要的用。
所谓边缘(edge)是指图像局部特征的不连续性。
灰度或结构信息的突变称为边缘,例如:灰度级的突变、颜色的突变、纹理结的突变。
matlab sobel函数
![matlab sobel函数](https://img.taocdn.com/s3/m/036b6daaf9c75fbfc77da26925c52cc58bd690ea.png)
一、介绍MATLAB Sobel函数MATLAB中的Sobel函数是图像处理工具箱中常用的函数之一,它主要用于边缘检测。
Sobel算子是一种常用的边缘检测算子,可以帮助我们找到图像中的边缘,对图像进行分割和识别等操作起到了至关重要的作用。
在MATLAB中,我们可以通过调用Sobel函数来实现对图像的边缘检测,以及其他相关的图像处理操作。
二、Sobel算子的原理Sobel算子是一种离散型的微分算子,用于检测图像中的边缘。
它通过对图像中每个像素点的灰度值进行加权求和,来获取该像素点的梯度值,并在图像中标记出边缘。
Sobel算子通常使用3x3的模板来进行计算,分为水平和垂直两个方向,分别对图像进行卷积操作。
水平方向的Sobel算子可以帮助我们检测图像中的垂直边缘,而垂直方向的Sobel算子可以帮助我们检测图像中的水平边缘。
三、MATLAB中Sobel函数的基本用法在MATLAB中,我们可以通过调用Sobel函数来实现对图像的边缘检测。
Sobel函数的基本语法如下:```BW = edge(I,'sobel');```其中,I代表输入的灰度图像,'sobel'表示使用Sobel算子进行边缘检测。
调用Sobel函数后,将得到一个二值化的图像BW,其中边缘像素被标记为1,非边缘像素被标记为0。
除了基本的边缘检测之外,Sobel函数还可以通过指定阈值来进行边缘强度的筛选,以及指定方向来进行特定方向的边缘检测。
例如:```BW = edge(I,'sobel',threshold,direction);```其中,threshold表示设定的阈值,direction表示指定的方向。
通过这种方式,我们可以根据具体需求来定制化Sobel函数的边缘检测操作。
四、Sobel算子在图像处理中的应用Sobel算子作为一种经典的边缘检测算子,在图像处理领域有着广泛的应用。
其主要应用包括但不限于以下几个方面:1. 物体识别使用Sobel算子进行边缘检测可以帮助我们找到图像中的物体轮廓,从而实现对物体的自动识别和定位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《图像处理中的数学方法》实验报告学生姓名:***教师姓名:曾理学院:数学与统计学院专业:信息与计算科学学号:********联系方式:139****1645梯度和拉普拉斯算子在图像边缘检测中的应用一、数学方法边缘检测最通用的方法是检测灰度值的不连续性,这种不连续性用一阶和二阶导数来检测。
1.(1)一阶导数:一阶导数即为梯度,对于平面上的图像来说,我们只需用到二维函数的梯度,即:∇f=[g xg y]=[ðf ðxðfðy],该向量的幅值:∇f=mag(∇f)=[g x2+g y2]1/2= [(ðf/ðx)2+(ðf/ðy)2]1/2,为简化计算,省略上式平方根,得到近似值∇f≈g x2+g y2;或通过取绝对值来近似,得到:∇f≈|g x|+|g y|。
(2)二阶导数:二阶导数通常用拉普拉斯算子来计算,由二阶微分构成:∇2f(x,y)=ð2f(x,y)ðx2+ð2f(x,y)ðy22.边缘检测的基本思想:(1)寻找灰度的一阶导数的幅度大于某个指定阈值的位置;(2)寻找灰度的二阶导数有零交叉的位置。
3.几种方法简介(1)Sobel边缘检测器:以差分来代替一阶导数。
Sobel边缘检测器使用一个3×3邻域的行和列之间的离散差来计算梯度,其中,每行或每列的中心像素用2来加权,以提供平滑效果。
∇f=[g x2+g y2]1/2={[(z7+2z8+z9)−(z1+2z2+z3)]2+[(z3+2z6+z9)−(z1+2z4+z7)]2}1/2(2)Prewitt边缘检测器:使用下图所示模板来数字化地近似一阶导数。
与Sobel检测器相比,计算上简单一些,但产生的结果中噪声可能会稍微大一些。
g x=(z7+z8+z9)−(z1+z2+z3)g y=(z3+z6+z9)−(z1−z4−z7)(3)Roberts边缘检测器:使用下图所示模板来数字化地将一阶导数近似为相邻像素之间的差,它与前述检测器相比功能有限(非对称,且不能检测多种45°倍数的边缘)。
g x=z9−z5g y=z8−z6(4)Laplace边缘检测器:二维函数f(x,y)的拉普拉斯是一个二阶的微分定义:∇2f(x,y)=ð2f(x,y)ðx2+ð2f(x,y)ðy2模板算子可分为四邻域和八邻域,如下:(四邻域)(八邻域)(5) LoG 边缘检测器由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的是LoG 算子,即Laplacian -Guass 算子。
引入高斯函数来平滑噪声:该函数的Laplace 算子:它把Guass 平滑滤波器和Laplace 锐化滤波器结合起来,先平滑掉噪声,再进行边缘检测,所以效果比单用Laplace 算子要更为平滑,效果更好。
(6) Canny 边缘检测器主要分为以下几个步骤:①使用具有指定标准差的一个高斯滤波器来平滑图像,以减少噪声;②在每个点处计算局部梯度和边缘方向;③对步骤②中确定的边缘点产生梯度中的脊线顶部进行追踪,并将实际山不在脊线顶部的像素设置为零,从而在输出中给出一条细线(非最大值抑制),然后使用滞后阈值处理法对这些脊线像素进行阈值处理。
最后进行边缘连接。
G (x ,y )=e −x 2+y 22σ2∇2G (x ,y )=ð2G (x ,y )ðx 2+ð2G (x ,y )ðy 2= x 2+y 2−2σ2σ4e−x 2+y22σ2二、实验结果原始图像:1.Roberts算子2.Prewitt算子3.Sobel算子place算子(4邻域)(8邻域)5.LoG四种结果的比较:(Laplace采用8邻域模板)图像来源:/show/05248 591.html(网行天下首页>>设计图库>>文化艺术>>插画集:《牧羊犬灰度》)图像规格:800×677 格式:SVG 模式:RGB硬件条件:软件条件:运行环境:Matlab r2015b三、讨论1.各方法优缺点及比较:(1)Roberts算子:Roberts算子是2×2算子,对具有陡峭的低噪声图像响应最好,并且检测垂直边缘的效果好于斜向边缘,定位精度高。
然而,它对噪声敏感,无法抑制噪声的影响。
因此,它适用于边缘明显且噪声较少的图像分割。
(2)Prewitt算子:Prewitt算子将两个点的各自一定领域内的灰度值求和,并根据两个灰度值和的差来计算x,y的偏导数。
它是平均滤波,对噪声有抑制作用,对于灰度渐变的低噪声图像有较好的检测效果,但是像素平均相当于对图像的低通滤波,所以它对边缘的定位不如Roberts算子。
对于混合多复杂噪声的图像,效果不太理想。
(3)Sobel算子:Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。
美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,即Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
(4)Laplace算子:Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。
Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。
存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。
(5)LoG算子:由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。
所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian 算子的二阶导数引起的逐渐增加的噪声影响。
(6)Canny算子:是一个具有滤波,增强和检测的多阶段的优化算子,在进行处理前,Canny 算子先利用高斯平滑滤波器来平滑图像以消除噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度的幅值和方向。
在处理过程中,Canny算法还将经过一个非极大值抑制的过程。
最后Canny算法将采用两个阈值来连接边缘。
高定位精度、低误判率、抑制虚假边缘,适用于高噪声图像。
四、实际应用1、概述:图像边缘检测广泛应用于车牌识别,人脸识别,地震带检测,生物医疗以及产品外观检测等方面。
为了体现其实际应用,在此针对车牌识别来进行实验,实验流程如下:灰度处理二值化确定区域文字分割模板配对边缘检测均值滤波3、实验结果原图像:灰度处理:将彩色图像转化为灰度图像,缩小图片占用的空间,减少处理时间边缘检测:车牌区域的边缘信息一般比其他部分丰富且集中,只要背景不太复杂,没有过多干扰,边缘特征可将车牌区域与其他部分区别开来,从而消除图像中的无关信息。
腐蚀和膨胀:腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割最后将车牌号分割成七个单个字符,建立模板库,与其进行配对,最终得出结果。
五、程序介绍(1)Roberts边缘检测clear;sourcePic=imread('C:\Users\34899\Desktop\timg.jpg'); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=0.2; %设定阈值for j=1:m-1 %进行边界提取for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) +abs(grayPic(j+1,k)-grayPic(j,k+1));if(robertsNum > robertThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendsubplot(1,2,1);imshow(sourcePic);title('原图');subplot(1,2,2);imshow(newGrayPic);title('Robert算子处理后图像');(2)Prewitt边缘检测clear;sourcePic=imread('C:\Users\34899\Desktop\timg.jpg'); %读取原图像grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素PrewittNum=0;%经Prewitt算子计算得到的每个像素的值PrewittThreshold=0.5;%设定阈值for j=2:m-1 %进行边界提取for k=2:n-1PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPi c(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-gray Pic(j,k-1)-grayPic(j+1,k-1));if(PrewittNum > PrewittThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendsubplot(1,2,1);imshow(sourcePic);title('原图');subplot(1,2,2);imshow(newGrayPic);title('Prewitt算子处理后图像');(3)Sobel边缘检测clear all;close all;imag = imread('C:\Users\34899\Desktop\timg.jpg'); %读取关键帧imag = rgb2gray(imag); %转化为灰度图subplot(1,2,1);imshow(imag);title('原图');[high,width] = size(imag); % 获得图像的高度和宽度F2 = double(imag);U = double(imag);uSobel = imag;for i = 2:high - 1 %sobel边缘检测for j = 2:width - 1Gx = (U(i+1,j-1) + 2*U(i+1,j) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i-1,j) + F2(i-1,j+1));Gy = (U(i-1,j+1) + 2*U(i,j+1) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i,j-1) + F2(i+1,j-1));uSobel(i,j) = sqrt(Gx^2 + Gy^2);endendsubplot(1,2,2);imshow(im2uint8(uSobel)):title('Sobel边缘检测后'); (4)Laplace边缘检测主函数:f=imread('C:\Users\34899\Desktop\timg.jpg')fGray=rgb2gray(f);figure()imshow(fGray),title('灰度图像');fGray=double(fGray);T=60;LapModType=8;%设置laplace模板方式fLapEdge=LaplaceEdge(fGray,LapModType,T);fGrayLapEdge=uint8(fLapEdge);figure()imshow(fLapEdge),title('laplace边缘图像');四邻域算子和八邻域算子function fLapEdge=LaplaceEdge(fGray,MoldType,Thresh)%-------------------------参数介绍-----------------%输入参数:% fGray;输入的灰度图像% MoldType:模板类型,包括四邻域和八邻域% Thresh:边缘检测阈值%输出参数:% fEdge:边缘像素点,存储的是二值化图像[r,c]=size(fGray);fLapEdge=zeros(r,c);%四邻域拉普拉斯边缘检测算子if 4==MoldTypefor i=2:r-1for j=2:c-1Temp=-4*fGray(i,j)+fGray(i-1,j)+fGray(i+1,j)+fGray(i,j-1)+fGray(i,j+1 );if Temp>ThreshfLapEdge(i,j)=255;elsefLapEdge(i,j)=0;endendendend%八邻域拉普拉斯边缘检测算子if 8==MoldTypefor i=2:r-1for j=2:c-1Temp=-8*fGray(i,j)+fGray(i-1,j)+fGray(i+1,j)+fGray(i,j-1)+fGray(i,j+1 )+fGray(i-1,j-1)+fGray(i+1,j+1)+fGray(i+1,j-1)+fGray(i-1,j+1);if Temp>ThreshfLapEdge(i,j)=255;elsefLapEdge(i,j)=0;endendendEnd(5)拉普拉斯—高斯检测器clc; clear all;close all;hsize = [5 5];sigma = 0.5;h = fspecial('log', hsize, sigma);I = imread('C:\Users\34899\Desktop\timg.jpg');bw = imfilter(I, h, 'replicate');figure;subplot(1, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold'); subplot(1, 2, 2); imshow(bw, []); title('边缘图像', 'FontWeight', 'Bold');(6)Canny算子tic % 记录CPU使用时间,开始计时I = imread('C:\Users\34899\Desktop\timg.jpg'); % 读入图像I=rgb2gray(I); % 转化为灰色图像% figure,imshow(I);title('原图') % 显示原图像% a = im2single(I); % 将图像矩阵转换为单精度类型% a = im2uint8(a); % 将图像矩阵转换为8位无符号整数类型% I = uint16(I); % 8位无符号整数转化为16位无符号整数%**************************** matlab的高斯平滑****************************[row,line] = size(I); % 行列temp = zeros(row+8,line+8); % 申请空间imagedata = zeros(row,line); % 申请空间% 高斯核计算,核大小为9*9GaussianDieOff = .0001;sigma = 1;pw = 1:30; % possible widthsssq = sigma^2;width = find(exp(-(pw.*pw)/(2*ssq))>GaussianDieOff,1,'last'); if isempty(width)width = 1; % the user entered a really small sigmaendt = (-width:width);gau = exp(-(t.*t)/(2*ssq))/(2*pi*ssq);kernel = gau' * gau; % 高斯核,大小为9*9kernel = im2single(kernel);% 图像边缘复制for q = 5:row+4 % 首先载入源图像信息for p = 5:line+4temp(q,p) = I(q-4,p-4);endendfor q = 1:row+8 % 复制列5:line+4for p = 5:line+4if(q<5)temp(q,p) = temp(5,p);endif(q>row+4)temp(q,p) = temp(row+4,p);endendendfor q = 1:row+8 % 复制行1:row+8for p = 1:line+8if(p<5)temp(q,p) = temp(q,5);endif(p>line+4)temp(q,p) = temp(q,line+4);endendendfor q = 1:row % 高斯卷积for p = 1:linefor n = 1:9for m = 1:9imagedata(q,p) = imagedata(q,p) + kernel(n,m) * temp(q+n-1,p+m-1);endendend%************************ matlab的高斯平滑说明结束************************%****************************** matlab求梯度******************************dx = zeros(size(I)); % 申请空间,存放x方向的幅值dy = zeros(size(I)); % 申请空间,存放y方向的幅值[x,y]=meshgrid(-width:width,-width:width);dgau2D=-x.*exp(-(x.*x+y.*y)/(2*ssq))/(pi*ssq); % 核% 图像边缘复制for q = 5:row+4 % 首先载入源图像信息for p = 5:line+4temp(q,p) = imagedata(q-4,p-4);endendfor q = 1:row+8 % 复制列5:line+4for p = 5:line+4if(q<5)temp(q,p) = temp(5,p);endif(q>row+4)temp(q,p) = temp(row+4,p);endendendfor q = 1:row+8 % 复制行1:row+8for p = 1:line+8if(p<5)temp(q,p) = temp(q,5);endif(p>line+4)temp(q,p) = temp(q,line+4);endendendfor q = 1:row % x方向卷积for p = 1:linefor n = 1:9for m = 1:9dx(q,p) = dx(q,p) + dgau2D(n,m) * temp(q+n-1,p+m-1);endendenddgau2D = dgau2D';for q = 1:row % y方向卷积for p = 1:linefor n = 1:9for m = 1:9dy(q,p) = dy(q,p) + dgau2D(n,m) * temp(q+n-1,p+m-1);endendendend%**************************** matlab求梯度结束****************************%***************************** 自适应阈值计算*****************************value = sqrt(dx.^2 + dy.^2); % 幅值value = double(value);value = value/max(max(value));% 归一化temp_value = value;counts=imhist(value, 64);high_threshold = find(cumsum(counts) > 0.7*row*line,1,'first') / 64; low_threshold = 0.4 * high_threshold; % 低阈值clear counts%*************************** 自适应阈值计算结束***************************%***************************** 方向与阈值判别*****************************num = 0; % 当前堆栈个数flag = zeros(80000,2); % 堆栈temp_flag = zeros(80000,2); % 临时堆栈imagedata = zeros(row,line); % 初始化% 方向:% 0为0°~45°% 1为45°~90°% 2为90°~135°% 3为135°~180°direction = zeros(size(I)); % 申请空间,存放小于高阈值而大于低阈值for q = 2:row-1for p = 2:line-1if((dy(q,p)<=0 && dx(q,p)>-dy(q,p)) || (dy(q,p)>=0 &&dx(q,p)<-dy(q,p)))d = abs(dy(q,p)/dx(q,p)); % 0°~45°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q,p+1)*(1-d) + temp_value(q-1,p+1)*d; gradmag2 = temp_value(q,p-1)*(1-d) + temp_value(q+1,p-1)*d;elseif((dx(q,p)>0 && -dy(q,p)>=dx(q,p)) || (dx(q,p)<0 &&-dy(q,p)<=dx(q,p)))d = abs(dx(q,p)/dy(q,p)); % 45°~90°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q-1,p)*(1-d) + temp_value(q-1,p+1)*d; gradmag2 = temp_value(q+1,p)*(1-d) + temp_value(q+1,p-1)*d;elseif((dx(q,p)<=0 && dx(q,p)>dy(q,p)) || (dx(q,p)>=0 &&dx(q,p)<dy(q,p)))d = abs(dx(q,p)/dy(q,p)); % 90°~135°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q-1,p)*(1-d) + temp_value(q-1,p-1)*d; gradmag2 = temp_value(q+1,p)*(1-d) + temp_value(q+1,p+1)*d;elseif((dy(q,p)<0 && dx(q,p)<=dy(q,p)) || (dy(q,p)>0 &&dx(q,p)>=dy(q,p)))d = abs(dy(q,p)/dx(q,p)); % 135°~180°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q,p-1)*(1-d) + temp_value(q-1,p-1)*d; gradmag2 = temp_value(q,p+1)*(1-d) + temp_value(q+1,p+1)*d;endif(gradmag>=gradmag1 && gradmag>=gradmag2)if(gradmag >= high_threshold) % 高阈值判别value(q,p) = 255;elseif(gradmag >= low_threshold)% 低阈值判别value(q,p) = 125;elsevalue(q,p) = 0; % 小于低阈值endelsevalue(q,p) = 0; % 非极大值抑制endendendfor q = 2:row-1 % 高阈值判别,检查高阈值邻域8个方向范围内是否存在低阈值for p = 2:line-1if(value(q,p) == 255)imagedata(q,p) = 255;if(value(q-1,p-1) == 125)value(q-1,p-1) = 255;imagedata(q-1,p-1) = 255;if((q-1 > 1) && (p-1 > 1))num = num + 1;flag(num,1) = q-1;flag(num,2) = p-1;endendif(value(q-1,p) == 125)value(q-1,p) = 255;imagedata(q-1,p) = 255;if(q-1 > 1)num = num + 1;flag(num,1) = q-1;flag(num,2) = p;endendif(value(q-1,p+1) == 125)value(q-1,p+1) = 255;imagedata(q-1,p+1) = 255;if((q-1 > 1) && (p+1 < line)) num = num + 1;flag(num,1) = q-1;flag(num,2) = p+1;endendif(value(q,p-1) == 125)value(q,p-1) = 255;imagedata(q,p-1) = 255;if(p-1 > 1)num = num + 1;flag(num,1) = q;flag(num,2) = p-1;endendif(value(q,p+1) == 125)value(q,p+1) = 255;imagedata(q,p+1) = 255;if(p+1 < line)num = num + 1;flag(num,1) = q;flag(num,2) = p+1;endendif(value(q+1,p-1) == 125)value(q+1,p-1) = 255;imagedata(q+1,p-1) = 255;if((q+1 < row) && (p-1 > 1))num = num + 1;flag(num,1) = q+1;flag(num,2) = p-1;endendif(value(q+1,p) == 125)value(q+1,p) = 255;imagedata(q+1,p) = 255;if(q+1 < row)num = num + 1;flag(num,1) = q+1;flag(num,2) = p;endendif(value(q+1,p+1) == 125)value(q+1,p+1) = 255;imagedata(q+1,p+1) = 255;if((q+1 < row) && (p+1 < line)) num = num + 1;flag(num,1) = q+1;flag(num,2) = p+1;endendendendenddone = num; % 完成标志,等于0表示当前连线已完成while done ~= 0num = 0;for temp_num = 1:doneq = flag(temp_num,1);p = flag(temp_num,2);if(value(q-1,p-1) == 125)value(q-1,p-1) = 255;imagedata(q-1,p-1) = 255;if((q-1 > 1) && (p-1 > 1))num = num + 1;temp_flag(num,1) = q-1;temp_flag(num,2) = p-1;endendif(value(q-1,p) == 125)value(q-1,p) = 255;imagedata(q-1,p) = 255;if(q-1 > 1)num = num + 1;temp_flag(num,1) = q-1;temp_flag(num,2) = p;endendif(value(q-1,p+1) == 125)value(q-1,p+1) = 255;imagedata(q-1,p+1) = 255;if((q-1 > 1) && (p+1 < line)) num = num + 1;temp_flag(num,1) = q-1;temp_flag(num,2) = p+1;endendif(value(q,p-1) == 125)value(q,p-1) = 255;imagedata(q,p-1) = 255;if(p-1 > 1)num = num + 1;temp_flag(num,1) = q;temp_flag(num,2) = p-1;endendif(value(q,p+1) == 125)value(q,p+1) = 255;imagedata(q,p+1) = 255;if(p+1 < line)num = num + 1;temp_flag(num,1) = q;temp_flag(num,2) = p+1;endendif(value(q+1,p-1) == 125)value(q+1,p-1) = 255;imagedata(q+1,p-1) = 255;if((q+1 < row) && (p-1 > 1)) num = num + 1;temp_flag(num,1) = q+1;temp_flag(num,2) = p-1;endendif(value(q+1,p) == 125)value(q+1,p) = 255;imagedata(q+1,p) = 255;if(q+1 < row)num = num + 1;temp_flag(num,1) = q+1;temp_flag(num,2) = p;endendif(value(q+1,p+1) == 125)value(q+1,p+1) = 255;imagedata(q+1,p+1) = 255;if((q+1 < row) && (p+1 < line))num = num + 1;temp_flag(num,1) = q+1;temp_flag(num,2) = p+1;endendenddone = num;flag = temp_flag;end%*************************** 方向与阈值判别结束***************************%****************************** 目标图像显示******************************imagedata = uint8(imagedata); % 16位无符号整数转化为8位无符号整数figure,imshow(imagedata);title('canny算子检测后') % 显示非极大值抑制后的图像clear all%**************************** 目标图像显示结束****************************toc % 记录CPU使用时间,结束计时(7)车牌号识别2:代码(主函数):function [d]=main(jpg)close allclcI=imread('C:\Users\34899\Desktop\chepai.jpg');figure(1),imshow(I);title('原图')I1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(I1);title('灰度图');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%I2=edge(I1,'robert',0.15,'both');%figure(3),imshow(I2);title('robert算子边缘检测')sourcePic=imread('C:\Users\34899\Desktop\chepai.jpg'); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作[m,n]=size(grayPic);I2=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=0.2; %设定阈值for j=1:m-1 %进行边界提取for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) +abs(grayPic(j+1,k)-grayPic(j,k+1));if(robertsNum > robertThreshold)I2(j,k)=255;elseI2(j,k)=0;endendendfigure(3),imshow(I2);title('Roberts算子检测后图像');se=[1;1;1];I3=imerode(I2,se);figure(4),imshow(I3);title('腐蚀后图像');se=strel('rectangle',[25,25]);I4=imclose(I3,se);figure(5),imshow(I4);title('平滑图像的轮廓');I5=bwareaopen(I4,2000);%figure(6),mesh(I5);title('从对象中移除小对象');[y,x,z]=size(I5);myI=double(I5);ticBlue_y=zeros(y,1);for i=1:yfor j=1:xif(myI(i,j,1)==1)Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%%%%%% X方向 %%%%%%%%%Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1;endendendPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'dw.jpg');[filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像'); jpg=strcat(filepath,filename);a=imread('dw.jpg');b=mat2gray(a);imwrite(b,'1.车牌灰度图像.jpg');figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));%T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值T=0.5;[m,n]=size(b);d=(double(b)>=T); % d:二值图像imwrite(d,'2.车牌二值图像.jpg');figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像')figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前')% 滤波h=fspecial('average',3);d=im2bw(round(filter2(h,d)));imwrite(d,'4.均值滤波后.jpg');figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后')% 某些图像进行操作% 膨胀或腐蚀% se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀% 'line'/'diamond'/'ball'...se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵[m,n]=size(d);if bwarea(d)/m/n>=0.365d=imerode(d,se);elseif bwarea(d)/m/n<=0.235d=imdilate(d,se);endimwrite(d,'5.膨胀或腐蚀处理后.jpg');figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d);[m,n]=size(d);figure,subplot(2,1,1),imshow(d),title(n)k1=1;k2=1;s=sum(d);j=1;while j~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/6.5)[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0; % 分割endend% 再切割d=qiege(d);% 切割出 7 个字符y1=10;y2=0.25;flag=0;word1=[];while flag==0[m,n]=size(d);left=1;wide=0;while sum(d(:,wide+1))~=0wide=wide+1;endif wide<y1 % 认为是左侧干扰d(:,[1:wide])=0;d=qiege(d);elsetemp=qiege(imcrop(d,[1 1 wide m]));[m,n]=size(temp);all=sum(sum(temp));two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));if two_thirds/all>y2flag=1;word1=temp; % WORD 1endd(:,[1:wide])=0;d=qiege(d);endend% 分割出第二个字符[word2,d]=getword(d);% 分割出第三个字符[word3,d]=getword(d);% 分割出第四个字符[word4,d]=getword(d);% 分割出第五个字符[word5,d]=getword(d);% 分割出第六个字符[word6,d]=getword(d);% 分割出第七个字符[word7,d]=getword(d);subplot(5,7,1),imshow(word1),title('1');subplot(5,7,2),imshow(word2),title('2');subplot(5,7,3),imshow(word3),title('3');subplot(5,7,4),imshow(word4),title('4');subplot(5,7,5),imshow(word5),title('5');subplot(5,7,6),imshow(word6),title('6');subplot(5,7,7),imshow(word7),title('7');[m,n]=size(word1);% 商用系统程序中归一化大小为 40*20,此处演示word1=imresize(word1,[40 20]);word2=imresize(word2,[40 20]);word3=imresize(word3,[40 20]);word4=imresize(word4,[40 20]);word5=imresize(word5,[40 20]);word6=imresize(word6,[40 20]);word7=imresize(word7,[40 20]);subplot(5,7,15),imshow(word1),title('1');subplot(5,7,16),imshow(word2),title('2');subplot(5,7,17),imshow(word3),title('3');subplot(5,7,18),imshow(word4),title('4');subplot(5,7,19),imshow(word5),title('5');subplot(5,7,20),imshow(word6),title('6');subplot(5,7,21),imshow(word7),title('7');imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');liccode=char(['0':'9''A':'Z''苏豫陕鲁']); %建立自动识别字符代码表SubBw2=zeros(40,20);l=1;for I=1:7ii=int2str(I);t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');if l==1 %第一位汉字识别kmin=37;kmax=40;elseif l==2 %第二位 A~Z 字母识别kmin=11;kmax=36;else l>=3 %第三位以后是字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat('字符模板\',liccode(k2),'.jpg');SamBw2 = imread(fname);for i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend% 以上相当于两幅图相减得到第三幅图Dmax=0;for k1=1:40for l1=1:20if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 )Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);MinError=min(Error1);findc=find(Error1==MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;endfigure(10),imshow(dw),title (['车牌号码:', Code],'Color','b');六、参考文献【1】Rafeal C.Gonzalez、Richard E.Woods、Steven L.Eddins,数字图像处理,第二版,2014,电子工业出版社【2】https:///view/61044c4cc5da50e2524d7fa1.html【3】https:///view/a8d86d8a55270722182ef77e.html【4】/p-0364341669667.html【5】/p-1051850256.html【6】https:///view/d270b2366137ee06eef9186a.html【7】https:///view/adc3fa0c0c22590103029d97.html。