prewitt算子matlab代码(matlab软件prewitt算子程序)
admin 发布:2022-12-19 07:36 173
本篇文章给大家谈谈prewitt算子matlab代码,以及matlab软件prewitt算子程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、matlab canny算子边缘检测函数代码是什么?
- 2、用Sobel算子、Roberts算子、Prewitt算子对图像进行边缘检测的程序,在matlab环境下,程序要完整,最好有图
- 3、8方向prewitt算子MATLAB程序
- 4、matlab二值图像截取
- 5、图像污垢检测用什么方法,matlab编程
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;
用Sobel算子、Roberts算子、Prewitt算子对图像进行边缘检测的程序,在matlab环境下,程序要完整,最好有图
close all
clear all
I=imread('tig.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.2,'bicubic'); %图像大小
BW1=edge(I5,'sobel'); %sobel图像边缘提取
BW2=edge(I5,'roberts'); %roberts图像边缘提取
BW3=edge(I5,'prewitt'); %prewitt图像边缘提取
BW4=edge(I5,'log'); %log图像边缘提取
BW5=edge(I5,'canny'); %canny图像边缘提取
h=fspecial('gaussian',5); %高斯滤波
BW6=edge(I5,'zerocross',[ ],h); %zerocross图像边缘提取
figure;
subplot(1,3,1); %图划分为一行三幅图,第一幅图
imshow(I2); %绘图
figure;
subplot(1,3,1);
imshow(BW1);
title('Sobel算子');
subplot(1,3,2);
imshow(BW2);
title('Roberts算子');
subplot(1,3,3);
imshow(BW3);
title('Prewitt算子');
8方向prewitt算子MATLAB程序
I=imread('cameraman.tif')
p=[-1 -1 -1;
0 0 0;
1 1 1;];
edgep=conv2(I,p,'same')
imshow(edgep)
方向应该是指算子的转置吧。
p=p'之类的,还有如下形式等;
p=[-1 -1 0;
1 0 -1;
0 1 1;]
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算子边缘检测结果
(注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)
图像污垢检测用什么方法,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); % σ=2
imshow(BW1);title('σ=2')
BW1 = edge(I,'log',0.003,3); % σ=3
figure, 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=140
I1=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 6
1 1 2 1 4 5 6 8
1 1 1 1 10 15 7 7
1 1 1 1 20 25 7 7
20 22 20 22 1 2 3 4
20 22 22 20 5 6 7 8
20 22 20 20 9 10 11 12
22 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:x
for 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;
end
end
end
figure(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(J);
prewitt算子matlab代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于matlab软件prewitt算子程序、prewitt算子matlab代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-18网站快速排名推广软件,网站快速排名推广软件
- 05-17拓客软件哪个好用,拓客软件有用吗
- 05-16b2b自动发帖软件,b2b自动发帖软件有哪些
- 05-16手机清理优化软件排名,2020手机清理软件排行
- 05-14淘宝店铺运营推广,淘宝店铺运营推广软件
- 05-14windows优化软件,windows 优化
- 05-14恶意点击软件哪个好,防恶意点击工具
- 05-13aso应用商店优化,aso优化软件
- 05-13百度seo收录软件,百度对https收录 seo
- 05-11网站优化排名软件推广,网站优化排名优化
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接