当前位置:首页 > 代码 > 正文

log边缘检测代码(log算子边缘检测)

admin 发布:2022-12-19 21:53 143


本篇文章给大家谈谈log边缘检测代码,以及log算子边缘检测对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

matlab canny算子边缘检测函数代码是什么?

I = imread('lena.bmp');                 %%如果是其他类型图像,请先转换为灰度图

%%没有噪声时的检测结果

BW_sobel = edge(I,'sobel');

BW_prewitt = edge(I,'prewitt');

BW_roberts = edge(I,'roberts');

BW_laplace = edge(I,'log');

BW_canny = edge(I,'canny'); figure(1);

subplot(2,3,1),imshow(I),xlabel('原始图像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');

subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');

%%加入高斯噪声(μ=0,σ^2=0.01)检测结果

I_g1 = imnoise(I,'gaussian',0,0.01);

BW_sobel = edge(I_g1,'sobel');

BW_prewitt = edge(I_g1,'prewitt');

BW_roberts = edge(I_g1,'roberts');

BW_laplace = edge(I_g1,'log');

BW_canny = edge(I_g1,'canny'); figure(2);

subplot(2,3,1),imshow(I_g1),xlabel('加入高斯噪声(μ=0,σ^2=0.01)图像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');

subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');

%%加入高斯噪声(μ=0,σ^2=0.02)检测结果

I_g2 = imnoise(I,'gaussian',0,0.02);

BW_sobel = edge(I_g2,'sobel');

BW_prewitt = edge(I_g2,'prewitt');

BW_roberts = edge(I_g2,'roberts');

BW_laplace = edge(I_g2,'log');

BW_canny = edge(I_g2,'canny'); figure(3);

subplot(2,3,1),imshow(I_g2),xlabel('加入高斯噪声(μ=0,σ^2=0.02)图像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');

subplot(2,3,6),imshow(BW_canny),xlabel('c

一、没有噪声时的检测结果 1 原始图像 

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测

二、加入高斯噪声(μ=0,σ^2=0.01)检测结果 1 原始图像

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测

三、加入高斯噪声(μ=0,σ^2=0.02)检测结果 1 原始图像

2 Sobel算子边缘检测 3 Prewitt算子边缘检测 4 Roberts算子边缘检测 5 Laplace算子边缘检测 6 Canny算子边缘检测

clear all; close all;

warning off all;

matlab二值图像截取

可以使用bwperim()函数进行轮廓提取,具体代码如下:

%读取原图  

im = imread( filepath );                

imshow(im);  

title('原图');

% 转二值图像  

bw = im2bw( im );

%轮廓提取    

contour = bwperim(bw);                    

figure  

imshow(contour);  

title('轮廓')  

原图和所提取的轮廓分别如图1和图2所示。

图1 原图

图2 轮廓

2 edge

可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。具体代码如下:

%读取原图  

im = imread( filepath );                

imshow(im);  

title('原图');

% 转二值图像  

bw = im2bw( im );                        

% 边界检测  

contour = edge(bw ,'canny');  

figure  

imshow(contour);  

title('边界')  

对图1的检测效果如图3所示:

图3 edge检测结果

参考资料

[1]轮廓提取

[2]matlab 二值图像 外轮廓提取

[3]matlab 二进制图像轮廓提取

============================================================================================

============================================================================================

转自:

**注意:填充时,轮廓线是闭合连续的

im=imread(filepath);                %读取原图

figure,imshow(im,[]);title('Raw');  %显示原图

im=im2bw(im);                       %转二值图像

figure,imshow(im,[]),title('BW');   %显示二值图像

im2=imfill(im,'holes');             %填充

im3=bwperim(im2);                   %轮廓提取

figure,imshow(im2,[]); title('')             %显示

figure,imshow(im3,[]);

1、Matlab简述

Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言。有人称它为“第四代”计算机语言,它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化界面设计、便捷的与其它程序和语言接口的功能。随着Matlab语言功能越来越强大,不断适应新的要求并提出新的解决方法,可以预见,在科学运算,自动控制与科学绘图领域,Matlab语言将长期保持其独一无二的地位。

2、几种常用的边缘检测算子

边缘是图像的最重要的特征,。边缘是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。边缘检测主要是灰度变化的度量、检测和定位。有很多种不同的边缘检测方法,同一种方法使用的滤波器也不尽相同。图像边缘检测就是研究更好的边缘检测方法和检测算子。

边缘检测的基本思想首先是(1)利用边缘增强算子,突出图像中的局部边缘,(2)然后定义象素的“边缘强度”,通过设置阈值的方法提取边缘点集。由于噪声和模糊的存在,监测到的边界可能会变宽或在某点处发生间断。因此,边界检测包括两个基本内容:

i.         用边缘算子提取出反映灰度变化的边缘点集

ii.        在边缘点集合中剔除某些边界点或填补边界间断点,并将这些边缘连接成完整的线

常用的检测算子有微分算子、拉普拉斯高斯算子和canny算子。

在Matlab图像处理工具箱中,提供了edge函数利用以上算子来检测灰度图像的边缘。

2.1微分算子法

经典的边缘提取方法是考察图像的每个像素的某个邻域内灰度的变化,利用边缘邻近一阶或二阶方向导数变化规律,用简单的方法检测边缘,称为微分算子法。

导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值较高,因此我们将图像的导数算子运算值作为相应的边界强度,所以可以通过对这些导数值设置阈值,提取边界的点集。

一阶导数是最简单的导数算子。已知在点f(x,y)处,梯度grad(F(x,y))的幅度为:

它们分别求出了灰度在x和y方向上的变化率,但是要对每一个像素进行以上的运算,运算量较大,所以在实际应用中常用小区域模板卷积运算来进行近似计算。模板运算的想法是将赋予某一个像素的值作为它本身灰度值和相邻象素灰度值的函数。运用中,对x,y方向各用一个模板。

2.1.1 Sobel算子

Sobel算子是滤波算子的形式来提取边缘。X,Y方向各用一个模板,两个模板组合起来构成1个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。

图1 Sobel算子模板

2.1.2 robert算子

Robert算子是一种梯度算子,它用交叉的差分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好:

模板如图:

图2 Robert算子模板

2.1.3 prewitt算子

prewitt算子是加权平均算子,对噪声有抑制作用,但是像素平均相当于对图像进行地同滤波,所以prewitt算子对边缘的定位不如robert算子。模板如图;

图3 prewitt算子模板

代码如下:

原始图像为三位编织复合材料二维截面图,对原始图像进行前期处理

i=imread('d1.jpg');

i2=im2double(i);

ihd=rgb2gray(i2);

[thr,sorh,keepapp]=ddencmp('den','wv',ihd);

ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);

figure,imshow(ixc),title('消噪后图像 ');

k2=medfilt2(ixc,[7 7]);

figure,imshow(k2),title('中值滤波');

isuo=imresize(k2,0.25,'bicubic');

%sobert、robert和prewitt算子检测图像边缘

esobel=edge(isuo,'sobel');

erob=edge(isuo,'roberts');

eprew=edge(isuo,'prewitt');

subplot(2,2,1);

imshow(isuo);title('前期处理图像');

subplot(2,2,2);

imshow(esobel);title('sobel算子提取');

subplot(2,2,3);

imshow(erob);title('roberts算子提取');

subplot(2,2,4);

imshow(eprew);title('prewitt算子提取');

图4 微分算子边缘检测结果

2.2 Laplacian算子

拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉。前面介绍的几种梯度法具有方向性,不能对各种走向的边缘都具有相同的增强效果。但是Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

对一个连续函数,它在位置的拉普拉斯算子定义如下:

在图像边缘检测中,为了运算方便,函数的拉普拉斯高斯算子也是借助模板来实现的。其模板有一个基本要求:模板中心的系数为正,其余相邻系数为负,所有系数的和应该为零。

图5 Laplacian算子模板

2.3  Canny边缘检测法

Canny边缘检测是一种比较新的边缘检测算子,具有很好的边缘监测性能,在图像处理中得到了越来越广泛的应用。它依据图像边缘检测最优准则设计canny边缘检测算法:

(1)       首先用2D高斯滤波模板进行卷积以消除噪声

(2)       利用导数算子找到图像灰度地沿着两个方向的偏导数,并求出梯度的大小:  

(3)       利用(2)的结果计算出梯度的方向

(4)       一旦知道了边缘的方向,就可以把边缘的梯度方向大致分为四种:水平、竖直、45度方向、135度方向。通过梯度的方向,就可以找到这个像素梯度方向的邻接像素。

(5)       遍历图像,若某个像素的灰度值与其梯度方向上前后两个像素的灰度值相比不是最大的,那么这个像素值置为0,即不是边缘。

(6)       使用累计直方图计算两个阈值,大于高阈值的一定是边缘,小于低阈值的一定不是边缘,介于之间的,看这个像素的邻接像素中有没有超过高阈值的边缘像素,如果有的话那么它

就是边缘了,否则它就不是边缘。

调用Laplacian算子、canny算子检测法检测图像边缘的程序如下:

elog=edge(isuo,'log');

ecanny=edge(isuo,'canny');

subplot(1,2,1);

imshow(elog);title('log算子提取');

subplot(1,2,2);

imshow(ecanny);title('canny算子提取');

图6 canny算子、Laplacian算子检测结果

3.边缘检测结果比较

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

参考文献

[1] 赵春晖.现代图像处理技术及Matlab实现[M].北京:人民邮电出版社,2001.

[2] 阮秋琦.数字图像处理学[M].北京:电子工业出版社,2001.

[3] 何斌.数字图像处理[M].北京:人民邮电出版社,2001

I=imread('lena.bmp');%  提取图像

BW1=edge(I,'sobel'); %用SOBEL算子进行边缘检测

BW2=edge(I,'roberts');%用Roberts算子进行边缘检测

BW3=edge(I,'prewitt'); %用prewitt算子进行边缘检测

BW4=edge(I,'log'); %用log算子进行边缘检测

BW5=edge(I,'canny'); %用canny算子进行边缘检测

h=fspecial('gaussian’,5);

BW6=edge(I,’canny’);

subplot(2,3,1), imshow(BW1);

title(‘sobel edge check’);

subplot(2,3,2), imshow(BW2);

title(‘sobel 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(‘gasussiancanny edge check’);%此为用高斯滤波后Canny算子边缘检测结果

(注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)

求教用edge函数提取图像的边缘问题

I=imread('lena.bmp');% 提取图像

BW1=edge(I,'sobel'); %用SOBEL算子进行边缘检测

BW2=edge(I,'roberts');%用Roberts算子进行边缘检测

BW3=edge(I,'prewitt'); %用prewitt算子进行边缘检测

BW4=edge(I,'log'); %用log算子进行边缘检测

BW5=edge(I,'canny'); %用canny算子进行边缘检测

h=fspecial('gaussian’,5);

BW6=edge(I,’canny’);

subplot(2,3,1), imshow(BW1);

title(‘sobel edge check’);

subplot(2,3,2), imshow(BW2);

title(‘sobel 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(‘gasussiancanny edge check’);%此为用高斯滤波后Canny算子边缘检测结果

(注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)

求MATLAB代码

MATLAB实用源代码

1图像的读取及旋转

A=imread('');%读取图像

subplot(2,2,1),imshow(A),title('原始图像');%输出图像

I=rgb2gray(A);

subplot(2,2,2),imshow(A),title('灰度图像');

subplot(2,2,3),imhist(I),title('灰度图像直方图');%输出原图直方图

theta = 30;J = imrotate(I,theta);% Try varying the angle, theta.

subplot(2,2,4), imshow(J),title(‘旋转图像’)

2边缘检测

I=imread('C:\Users\HP\Desktop\平时总结\路飞.jpg');

subplot(2,2,1),imshow(I),title('原始图像');

I1=edge(I,'sobel');

subplot(2,2,2),imshow(I1),title('sobel边缘检测');

I2=edge(I,'prewitt');

subplot(2,2,3),imshow(I2),title('prewitt边缘检测');

I3=edge(I,'log');

subplot(2,2,4),imshow(I3),title('log边缘检测');

3图像反转

MATLAB 程序实现如下:

I=imread('xian.bmp');

J=double(I);

J=-J+(256-1);%图像反转线性变换

H=uint8(J);

subplot(1,2,1),imshow(I);

subplot(1,2,2),imshow(H);

4.灰度线性变换

MATLAB 程序实现如下:

I=imread('xian.bmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I1=rgb2gray(I);

subplot(2,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on; %显示坐标系

J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]

subplot(2,2,3),imshow(J);

title('线性变换图像[0.1 0.5]');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]

subplot(2,2,4),imshow(K);

title('线性变换图像[0.3 0.7]');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

5.非线性变换

MATLAB 程序实现如下:

I=imread('xian.bmp');

I1=rgb2gray(I);

subplot(1,2,1),imshow(I1);

title(' 灰度图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

J=double(I1);

J=40*(log(J+1));

H=uint8(J);

subplot(1,2,2),imshow(H);

title(' 对数变换图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

4.直方图均衡化

MATLAB 程序实现如下:

I=imread('xian.bmp');

I=rgb2gray(I);

figure;

subplot(2,2,1);

imshow(I);

subplot(2,2,2);

imhist(I);

I1=histeq(I);

figure;

subplot(2,2,1);

imshow(I1);

subplot(2,2,2);

imhist(I1);

5. 线性平滑滤波器

用MATLAB实现领域平均法抑制噪声程序:

I=imread('xian.bmp');

subplot(231)

imshow(I)

title('原始图像')

I=rgb2gray(I);

I1=imnoise(I,'salt pepper',0.02);

subplot(232)

imshow(I1)

title(' 添加椒盐噪声的图像')

k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波

k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波

k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波

subplot(233),imshow(k1);title('3*3 模板平滑滤波');

subplot(234),imshow(k2);title('5*5 模板平滑滤波');

subplot(235),imshow(k3);title('7*7 模板平滑滤波');

subplot(236),imshow(k4);title('9*9 模板平滑滤波');

6.中值滤波器

用MATLAB实现中值滤波程序如下:

I=imread('xian.bmp');

I=rgb2gray(I);

J=imnoise(I,'saltpepper',0.02);

subplot(231),imshow(I);title('原图像');

subplot(232),imshow(J);title('添加椒盐噪声图像');

k1=medfilt2(J); %进行3*3模板中值滤波

k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波

k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波

k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波

subplot(233),imshow(k1);title('3*3模板中值滤波');

subplot(234),imshow(k2);title('5*5模板中值滤波 ');

subplot(235),imshow(k3);title('7*7模板中值滤波');

subplot(236),imshow(k4);title('9*9 模板中值滤波');

7.用Sobel算子和拉普拉斯对图像锐化:

I=imread('xian.bmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on;%显示坐标系

I1=im2bw(I);

subplot(2,2,2),imshow(I1);

title('二值图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

H=fspecial('sobel');%选择sobel算子

J=filter2(H,I1); %卷积运算

subplot(2,2,3),imshow(J);

title('sobel算子锐化图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on;%显示坐标系

h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子

J1=conv2(I1,h,'same');%卷积运算

subplot(2,2,4),imshow(J1);

title('拉普拉斯算子锐化图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

8.梯度算子检测边缘

用 MATLAB实现如下:

I=imread('xian.bmp');

subplot(2,3,1);

imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I1=im2bw(I);

subplot(2,3,2);

imshow(I1);

title('二值图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I2=edge(I1,'roberts');

figure;

subplot(2,3,3);

imshow(I2);

title('roberts算子分割结果');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I3=edge(I1,'sobel');

subplot(2,3,4);

imshow(I3);

title('sobel算子分割结果');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I4=edge(I1,'Prewitt');

subplot(2,3,5);

imshow(I4);

title('Prewitt算子分割结果 ');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

9.LOG算子检测边缘

用 MATLAB程序实现如下:

I=imread('xian.bmp');

subplot(2,2,1);

imshow(I);

title('原始图像');

I1=rgb2gray(I);

subplot(2,2,2);

imshow(I1);

title('灰度图像');

I2=edge(I1,'log');

subplot(2,2,3);

imshow(I2);

title('log算子分割结果');

10.Canny算子检测边 缘

用MATLAB程序实现如下:

I=imread('xian.bmp');

subplot(2,2,1);

imshow(I);

title('原始图像')

I1=rgb2gray(I);

subplot(2,2,2);

imshow(I1);

title('灰度图像');

I2=edge(I1,'canny');

subplot(2,2,3);

imshow(I2);

title('canny算子分割结果');

11.边界跟踪 (bwtraceboundary函数)

clc

clear all

I=imread('xian.bmp');

figure

imshow(I);

title('原始图像');

I1=rgb2gray(I); %将彩色图像转化灰度图像

threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限

BW=im2bw(I1, threshold); %将灰度图像转化为二值图像

figure

imshow(BW);

title('二值图像');

dim=size(BW);

col=round(dim(2)/2)-90; %计算起始点列坐标

row=find(BW(:,col),1); %计算起始点行坐标

connectivity=8;

num_points=180;

contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);

%提取边界

figure

imshow(I1);

hold on;

plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);

title('边界跟踪图像');

12.Hough变换

I= imread('xian.bmp');

rotI=rgb2gray(I);

subplot(2,2,1);

imshow(rotI);

title('灰度图像');

axis([50,250,50,200]);

grid on;

axis on;

BW=edge(rotI,'prewitt');

subplot(2,2,2);

imshow(BW);

title('prewitt算子边缘检测 后图像');

axis([50,250,50,200]);

grid on;

axis on;

[H,T,R]=hough(BW);

subplot(2,2,3);

imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');

title('霍夫变换图');

xlabel('\theta'),ylabel('\rho');

axis on , axis normal, hold on;

P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));

x=T(P(:,2));y=R(P(:,1));

plot(x,y,'s','color','white');

lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);

subplot(2,2,4);,imshow(rotI);

title('霍夫变换图像检测');

axis([50,250,50,200]);

grid on;

axis on;

hold on;

max_len=0;

for k=1:length(lines)

xy=[lines(k).point1;lines(k).point2];

plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');

plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

len=norm(lines(k).point1-lines(k).point2);

if(lenmax_len)

max_len=len;

xy_long=xy;

end

end

plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

13.直方图阈值法

用 MATLAB实现直方图阈值法:

I=imread('xian.bmp');

I1=rgb2gray(I);

figure;

subplot(2,2,1);

imshow(I1);

title(' 灰度图像')

axis([50,250,50,200]);

grid on;%显示网格线

axis on; %显示坐标系

[m,n]=size(I1);%测量图像尺寸参数

GP=zeros(1,256); %预创建存放灰度出现概率的向量

for k=0:255

GP(k+1)=length(find(I1==k))/(m*n);%计算每级灰度出现的概率,将其存入GP中相应位置

end

subplot(2,2,2),bar(0:255,GP,'g')%绘制直方图

title('灰度直方图')

xlabel('灰度值')

ylabel(' 出现概率')

I2=im2bw(I,150/255);

subplot(2,2,3),imshow(I2);

title('阈值150的分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

I3=im2bw(I,200/255); %

subplot(2,2,4),imshow(I3);

title('阈值200的分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

14. 自动阈值法:Otsu法

用MATLAB实现Otsu算法:

clc

clear all

I=imread('xian.bmp');

subplot(1,2,1),imshow(I);

title('原始图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

level=graythresh(I); %确定灰度阈值

BW=im2bw(I,level);

subplot(1,2,2),imshow(BW);

title('Otsu 法阈值分割图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

15.膨胀操作

I=imread('xian.bmp'); %载入图像

I1=rgb2gray(I);

subplot(1,2,1);

imshow(I1);

title('灰度图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

se=strel('disk',1); %生成圆形结构元素

I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀

subplot(1,2,2);

imshow(I2);

title(' 膨胀后图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

16.腐蚀操作

MATLAB 实现腐蚀操作

I=imread('xian.bmp'); %载入图像

I1=rgb2gray(I);

subplot(1,2,1);

imshow(I1);

title('灰度图像')

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

se=strel('disk',1); %生成圆形结构元素

I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀

subplot(1,2,2);

imshow(I2);

title('腐蚀后图像');

axis([50,250,50,200]);

grid on; %显示网格线

axis on; %显示坐标系

17.开启和闭合操作

用 MATLAB实现开启和闭合操作

I=imread('xian.bmp'); %载入图像

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on; %显示坐标系

I1=rgb2gray(I);

subplot(2,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on; %显示坐标系

se=strel('disk',1); %采用半径为1的圆作为结构元素

I2=imopen(I1,se); %开启操作

I3=imclose(I1,se); %闭合操作

subplot(2,2,3),imshow(I2);

title('开启运算后图像');

axis([50,250,50,200]);

axis on; %显示坐标系

subplot(2,2,4),imshow(I3);

title('闭合运算后图像');

axis([50,250,50,200]);

axis on; %显示坐标系

18.开启和闭合组合操作

I=imread('xian.bmp');%载入图像

subplot(3,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I1=rgb2gray(I);

subplot(3,2,2),imshow(I1);

title('灰度图像');

axis([50,250,50,200]);

axis on;%显示坐标系

se=strel('disk',1);

I2=imopen(I1,se);%开启操作

I3=imclose(I1,se);%闭合操作

subplot(3,2,3),imshow(I2);

title('开启运算后图像');

axis([50,250,50,200]);

axis on;%显示坐标系

subplot(3,2,4),imshow(I3);

title('闭合运算后图像');

axis([50,250,50,200]);

axis on;%显示坐标系

se=strel('disk',1);

I4=imopen(I1,se);

I5=imclose(I4,se);

subplot(3,2,5),imshow(I5);%开—闭运算图像

title('开—闭运算图像');

axis([50,250,50,200]);

axis on;%显示坐标系

I6=imclose(I1,se);

I7=imopen(I6,se);

subplot(3,2,6),imshow(I7);%闭—开运算图像

title('闭—开运算图像');

axis([50,250,50,200]);

axis on;%显示坐标系

19.形态学边界提取

利用 MATLAB实现如下:

I=imread('xian.bmp');%载入图像

subplot(1,3,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

I1=im2bw(I);

subplot(1,3,2),imshow(I1);

title('二值化图像');

axis([50,250,50,200]);

grid on;%显示网格线

axis on;%显示坐标系

I2=bwperim(I1); %获取区域的周长

subplot(1,3,3),imshow(I2);

title('边界周长的二值图像');

axis([50,250,50,200]);

grid on;

axis on;

20.形态学骨架提取

利用MATLAB实现如下:

I=imread('xian.bmp');

subplot(2,2,1),imshow(I);

title('原始图像');

axis([50,250,50,200]);

axis on;

I1=im2bw(I);

subplot(2,2,2),imshow(I1);

title('二值图像');

axis([50,250,50,200]);

axis on;

I2=bwmorph(I1,'skel',1);

subplot(2,2,3),imshow(I2);

title('1次骨架提取');

axis([50,250,50,200]);

axis on;

I3=bwmorph(I1,'skel',2);

subplot(2,2,4),imshow(I3);

title('2次骨架提取');

axis([50,250,50,200]);

axis on;

21.直接提取四个顶点坐标

I = imread('xian.bmp');

I = I(:,:,1);

BW=im2bw(I);

figure

imshow(~BW)

[x,y]=getpts

平滑滤波

h=fspecial('average',9);

I_gray=imfilter(I_gray,h,'replicate');%平滑滤波

关于log边缘检测代码和log算子边缘检测的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/26177.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载