我把程序贴下面了,这个是Robert算子的程序。换做其他算子,你只要该其中的一个矩阵就行了。查到这几个算子,然后替换,我在程序中会标出的。
clc
close all
clear all
%%%生成高斯平滑滤波模板%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
hg=zeros(3,3); %设定高斯平滑滤波模板的大小为33
delta=05;
for x=1:1:3
for y=1:1:3
u=x-2;
v=y-2;
hg(x,y)=exp(-(u^2+v^2)/(2pidelta^2));
end
end
h=hg/sum(hg(:));
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%读入图像%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
f = imread('1111tif'); % 读入图像文件
f=rgb2gray(im2double(f));
imshow(f)
title('原始图像');
[m,n]=size(f);
ftemp=zeros(m,n);
rowhigh=m-1;
colhigh=n-1;
%%%高斯滤波%%%
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
A=hmod;
ftemp(x,y)=sum(A(:));
end
end
f=ftemp
figure,imshow(f)
title('通过高斯滤波器后的图像');
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%利用roberts算子进行边缘检测%%%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];%%%%%你可以替换成其他算子,这里是罗伯特算子
% sx=[-1 -2 -1;0 0 0;1 2 1];
% sy=[-1 0 1;-2 0 2;-1 0 1];这个是Sobel算子,类似的,你可以替换成canny算子等等
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sxmod;
fsy=symod;
ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);
end
end
fr=im2uint8(ftemp);
figure,imshow(fr)
title('用roberts算子边缘检测的原始图像');
%%%域值分割%%%
TH1=60; %设定阈值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fr(x,y)>=TH1)&((fr(x,y-1) <= fr(x,y)) & (fr(x,y) > fr(x,y+1)) )
fr(x,y)=200;
elseif(fr(x,y)>=TH1)&( (fr(x-1,y) <=fr(x,y)) & (fr(x,y) >fr(x+1,y)))
fr(x,y)=200;
else fr(x,y)=50;
end
end
end
figure,imshow(fr)
title('用roberts算子边缘检测并细化后的图像');
I = imread('Lenabmp');
imshow(I),title('原图');
BW5 = edge(I,'kirsch');
figure;
imshow(BW5,[]),title('kirsch算子边缘检测');
程序如上,直接调用就可以
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('xianbmp');
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('xianbmp');
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,[01 05],[]); %局部拉伸,把[01 05]内的灰度拉伸为[0 1]
subplot(2,2,3),imshow(J);
title('线性变换图像[01 05]');
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
K=imadjust(I1,[03 07],[]); %局部拉伸,把[03 07]内的灰度拉伸为[0 1]
subplot(2,2,4),imshow(K);
title('线性变换图像[03 07]');
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
5非线性变换
MATLAB 程序实现如下:
I=imread('xianbmp');
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('xianbmp');
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('xianbmp');
subplot(231)
imshow(I)
title('原始图像')
I=rgb2gray(I);
I1=imnoise(I,'salt & pepper',002);
subplot(232)
imshow(I1)
title(' 添加椒盐噪声的图像')
k1=filter2(fspecial('average',3),I1)/255; %进行33模板平滑滤波
k2=filter2(fspecial('average',5),I1)/255; %进行55模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行77模板平滑滤波
k4=filter2(fspecial('average',9),I1)/255; %进行99模板平滑滤波
subplot(233),imshow(k1);title('33 模板平滑滤波');
subplot(234),imshow(k2);title('55 模板平滑滤波');
subplot(235),imshow(k3);title('77 模板平滑滤波');
subplot(236),imshow(k4);title('99 模板平滑滤波');
6中值滤波器
用MATLAB实现中值滤波程序如下:
I=imread('xianbmp');
I=rgb2gray(I);
J=imnoise(I,'salt&pepper',002);
subplot(231),imshow(I);title('原图像');
subplot(232),imshow(J);title('添加椒盐噪声图像');
k1=medfilt2(J); %进行33模板中值滤波
k2=medfilt2(J,[5,5]); %进行55模板中值滤波
k3=medfilt2(J,[7,7]); %进行77模板中值滤波
k4=medfilt2(J,[9,9]); %进行99模板中值滤波
subplot(233),imshow(k1);title('33模板中值滤波');
subplot(234),imshow(k2);title('55模板中值滤波 ');
subplot(235),imshow(k3);title('77模板中值滤波');
subplot(236),imshow(k4);title('99 模板中值滤波');
7用Sobel算子和拉普拉斯对图像锐化:
I=imread('xianbmp');
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('xianbmp');
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; %显示坐标系
9LOG算子检测边缘
用 MATLAB程序实现如下:
I=imread('xianbmp');
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算子分割结果');
10Canny算子检测边 缘
用MATLAB程序实现如下:
I=imread('xianbmp');
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('xianbmp');
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('边界跟踪图像');
12Hough变换
I= imread('xianbmp');
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(03max(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(len>max_len)
max_len=len;
xy_long=xy;
end
end
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');
13直方图阈值法
用 MATLAB实现直方图阈值法:
I=imread('xianbmp');
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))/(mn);%计算每级灰度出现的概率,将其存入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('xianbmp');
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('xianbmp'); %载入图像
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('xianbmp'); %载入图像
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('xianbmp'); %载入图像
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('xianbmp');%载入图像
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('xianbmp');%载入图像
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('xianbmp');
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('xianbmp');
I = I(:,:,1);
BW=im2bw(I);
figure
imshow(~BW)
[x,y]=getpts
平滑滤波
h=fspecial('average',9);
I_gray=imfilter(I_gray,h,'replicate');%平滑滤波
Press the "Start" button to see a demonstration of
denoising tools in the Wavelet Toolbox
This demo uses Wavelet Toolbox functions
% Set signal to noise ratio and set rand seed
sqrt_snr = 3; init = 2055615866;
% Generate original signal and a noisy version adding
% a standard Gaussian white noise
[xref,x] = wnoise(3,11,sqrt_snr,init);
% Denoise noisy signal using soft heuristic SURE thresholding
% and scaled noise option, on detail coefficients obtained
% from the decomposition of x, at level 5 by sym8 wavelet
% Generate original signal and a noisy version adding
% a standard Gaussian white noise
lev = 5;
xd = wden(x,'heursure','s','one',lev,'sym8');
% Denoise noisy signal using soft SURE thresholding
xd = wden(x,'rigrsure','s','one',lev,'sym8');
% Denoise noisy signal using fixed form threshold with
% a single level estimation of noise standard deviation
xd = wden(x,'sqtwolog','s','sln',lev,'sym8');
% Denoise noisy signal using fixed minimax threshold with
% a multiple level estimation of noise standard deviation
xd = wden(x,'minimaxi','s','sln',lev,'sym8');
% If many trials are necessary, it is better to perform
% decomposition one time and threshold it many times :
% decomposition
[c,l] = wavedec(x,lev,'sym8');
% threshold the decomposition structure [c,l]
xd = wden(c,l,'minimaxi','s','sln',lev,'sym8');
% Load electrical signal and select a part
load leleccum; indx = 2600:3100;
x = leleccum(indx);
% Use wdencmp for signal de-noising
% find default values (see ddencmp)
[thr,sorh,keepapp] = ddencmp('den','wv',x);
% denoise signal using global thresholding option
xd = wdencmp('gbl',x,'db3',2,thr,sorh,keepapp);
% Some trial examples without commands counterpart
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 5;
% [xref,x] = wnoise(1,11,sqrt_snr,init);
% Some trial examples without commands counterpart (more)
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 4;
% [xref,x] = wnoise(2,11,sqrt_snr,init);
% Some trial examples without commands counterpart (more)
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 3;
% [xref,x] = wnoise(3,11,sqrt_snr,init);
% Some trial examples without commands counterpart (more)
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 3;
% [xref,x] = wnoise(3,11,sqrt_snr,init);
% Some trial examples without commands counterpart (more)
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 3;
% [xref,x] = wnoise(3,11,sqrt_snr,init);
% Some trial examples without commands counterpart (more)
% Rand initialization: init = 2055615866;
% Square root of signal to noise ratio: sqrt_snr = 3;
% [xref,x] = wnoise(3,11,sqrt_snr,init);
以上就是关于高分求!!图像边缘检测算子的MATLAB程序!发到邮箱232111605@qq.com!全部的内容,包括:高分求!!图像边缘检测算子的MATLAB程序!发到邮箱232111605@qq.com!、Kirsch边缘检测算子MATLAB怎么调用、求MATLAB代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)