程序.docx
- 文档编号:4166082
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:48
- 大小:1.94MB
程序.docx
《程序.docx》由会员分享,可在线阅读,更多相关《程序.docx(48页珍藏版)》请在冰点文库上搜索。
程序
%将图片转化为二值图,根据直方图,以75分界4
if(I(i,j)>75)4
Otsu阈值:
4
谐波均值滤波器5
(三)利用直方图人工指定阈值对rice进行自动单阈值分割;7
滤波器8
(二)对图像加噪后分别使用MATLAB自带函数和自写函数进行平滑滤波,观察实验结果。
9
(三)自写函数实现对图像的锐化操作。
9
(四)分别使用最大值、最小值和中值滤波器对图像进行处理10
最小值:
11
中值:
12
(五)分别使用理想和巴特沃斯高低通滤波器对图像进行滤波(高斯噪声)12
图像灰度变换13
%对数变换14
3,反色变换14
4.灰度图像均衡化15
点检测15
阈值16
Sobel17
%LOG17
%Canny17
(一)调入给定的数字图像,并进行计算机均衡化处理,显示原图像的直方图和经过均衡化处理过的图像直方图。
19
(二)对图像加噪后分别使用MATLAB自带函数和自写函数进行平滑滤波,20
运用拉普拉斯算子梯度增强法进行图像锐化21
%最大值滤波器21
最小值:
22
%中值23
PSF25
2、灰度直方图均衡规格化26
程序二:
filter和conv的不同28
程序三:
滤波后信号幅度的变化28
MATLAB中提供了卷积运算的函数命令conv2,其语法格式为:
29
MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为:
29
Y=filter2(h,X)29
Fspecial函数用于创建预定义的滤波算子30
ordfilt2函数30
图像的点运算:
30
加法运算:
rice和cameraman31
3、flower变模糊31
4、减法运算:
ri32
乘法运算32
缩放运算33
图像翻转34
图像剪切 34
%将图片转化为二值图,根据直方图,以75分界
I=imread('Cameraman.bmp');
[mn]=size(I);
fori=1:
m
forj=1:
n
if(I(i,j)>75)
I(i,j)=255;%大于75,都变成背景色
else
I(i,j)=0;
end
end
end
imshow(I);
Otsu阈值:
I=imread('zhiwen.gif');
[T,SM]=graythresh(I);%otsu自动计算阈值函数,SM是可分性测度
g=im2bw(I,T)
figure,imshow(g)
谐波均值滤波器
图像分割与边缘检测
(二)用各梯度算子对图像进行边缘检测;
i=imread('rice1.jpg');
g=rgb2gray(i);
d=im2double(i);
subplot(131),imshow(i),title(‘原图');
[gv,t]=edge(g,'sobel',0.075,'horizontal');%II是输入图像,Sobel是运用的方法,parameters是参数g是一个数组,t是edge用于确定参数,T是阈值,dir(vertical)是检测的首选方向subplot(132),imshow(gv),title('水平方向');
[gv,t]=edge(g,'sobel',0.9,'horizontal');
subplot(133),imshow(gv),title('水平方向');
%LOG
i=imread('rice1.jpg');
g=rgb2gray(i);
d=im2double(i);
subplot(131),imshow(i),title('原图');
[gv,t]=edge(g,'log',0.005,2.25);
subplot(132),imshow(gv),title('高斯拉普拉斯LOG');
[gv,t]=edge(g,'log',0.1,2.25);%2.25是代表标准差。
默认为2
subplot(133),imshow(gv),title('高斯拉普拉斯LOG');
%Canny边缘检测器
i=imread('rice1.jpg');
g=rgb2gray(i);
d=im2double(i);
subplot(131),imshow(i),title('原图');
[gv,t]=edge(g,'canny',[0.040.1],1.5);%[0.040.1]是两个阈值,1.5是平面滤波的标准差,默认值为1
subplot(132),imshow(gv),title('Canny边缘检测器');
(四)用迭代法和OSTU法对rice进行自动单阈值分割;
x=imread('Lena.bmp');
%figure;%imshow(x);
[m,n]=size(x);
N=m*n;
num=zeros(1,256);
p=zeros(1,256);
fori=1:
m
forj=1:
n
num(x(i,j)+1)=num(x(i,j)+1)+1;
end
end
fori=0:
255;p(i+1)=num(i+1)/N;
end
totalmean=0;
fori=0:
255;
totalmean=totalmean+i*p(i+1);
end
maxvar=0;
fork=0:
255kk=k+1;
zerosth=sum(p(1:
kk));
firsth=0;
forh=0:
k
firsth=firsth+h*p(h+1);
end
var=totalmean*zerosth-firsth;
var=var*var;
var=var/(zerosth*(1-zerosth)+0.01);
var=sqrt(var);
if(var>maxvar)
maxvar=var;
point=k;
end
end
threshold=point;
I=imread('Lena.bmp');
%I=rgb2gray(I);
I=double(I);
T=double(min(I(:
))+max(I(:
)))/2;
done=false;
i=0;
while~done
r1=find(I<=T);
r2=find(I>T);
Tnew=(mean(I(r1))+mean(I(r2)))/2;
done=abs(Tnew-T)<1;
T=Tnew;
i=i+1;
end
I(r1)=0;
I(r2)=1;
disp('迭代法求得的阈值')
disp(T)
imshow(I),title('迭代法')
(三)利用直方图人工指定阈值对rice进行自动单阈值分割;
I1=imread('Cameraman.bmp');
subplot(131);imshow(I1);title('原图');
I=im2bw(I1);
subplot(132);imhist(I1);title('直方图');
[mn]=size(I1);
fori=1:
m
forj=1:
n
if(I1(i,j)>75)
I1(i,j)=255;%大于75,都变成背景色
else
I1(i,j)=0;
end
end
end
subplot(133);imshow(I1);title('分割以后图');
滤波器
调入给定的数字图像,并进行计算机均衡化处理,显示原图像的直方图和经过均衡化处理过的图像直方图。
观察均衡化后图像和直方图的变化。
结果如图。
I1=imread('flower.jpg');
subplot(4,3,1),imshow(I1);%显示原图
I=rgb2gray(I1);
subplot(4,3,2),imshow(I);%将彩色图转化为灰度图
subplot(4,3,3),imhist(I,50);%每隔50隔像素点统计一次
h=histeq(I);%均衡化,,画图片的直方图
subplot(4,3,4),imshow(h);
subplot(4,3,5),imhist(h);%显示均衡化以后的图像
(二)对图像加噪后分别使用MATLAB自带函数和自写函数进行平滑滤波,观察实验结果。
%2平滑滤波%自带函数
I=imread('Lena.bmp');
i=imnoise(I,'salt');%加盐噪
subplot(2,2,1),imshow(i);
h=fspecial('average');%3*3的邻域平均模板,生成均值滤波器
y=imfilter(i,h);%对图像进行滤波
subplot(2,2,2),imshow(y);
%2平滑滤波%自写函数
I=imread('Lena.bmp');
i=imnoise(I,'salt');%加盐噪
subplot(2,2,1),imshow(i);
Inew=myMidalp(i,3);%调用函数
subplot(2,2,3),imshow(Inew)
(三)自写函数实现对图像的锐化操作。
运用拉普拉斯算子梯度增强法进行图像锐化
[I,map]=imread('Lena.bmp');
Subplot(1,2,1)imshow(I,map);%map:
映射
I=double(I);
[Gx,Gy]=gradient(I);%计算梯度
G=sqrt(Gx.*Gx+Gy.*Gy);%注意是矩阵点乘
J=I;
K=find(G<=7);%查找非零元素
J(K)=25;Q=find(G>=7);
J(Q)=255;
Subplot(1,2,2),imshow(J,map);
(4)分别使用最大值、最小值和中值滤波器对图像进行处理,观察实验结果。
最大值:
%最大值滤波器
I2=imread('flower.jpg');
I1=rgb2gray(I2);
n=2;c=2;
mask=ones(n,n);
[r1,c1]=size(I1);
subplot(2,2,1);imshow(I2);title('原始图像');
subplot(2,2,2);imshow(I1);title('灰度图像');
I1=double(I1);
I1_max=I1;
mid=floor(n/2);
foru=1:
r1-n+1
forv=1:
c1-n+1
A=I1(u:
u+n-1,v:
v+n-1);
A=A.*mask;
I1_max(u+mid,v+mid)=max(max(A));
end
end
subplot(2,2,3);imshow(I1_max(mid+1:
r1-mid,mid+1:
c1-mid),[]);title('最大值图像');
最小值:
%最小值滤波器
I2=imread('flower.jpg');
I1=rgb2gray(I2);
n=2;c=2;
mask=ones(n,n);
[r1,c1]=size(I1);
subplot(2,2,1);imshow(I2);title('原始图像');
subplot(2,2,2);imshow(I1);title('灰度图像');
I1=double(I1);
I1_min=I1;
mid=floor(n/2);%floor:
向下取整
foru=1:
r1-n+1
forv=1:
c1-n+1
A=I1(u:
u+n-1,v:
v+n-1);
A=A.*mask;
I1_min(u+mid,v+mid)=min(min(A));
end
end
subplot(2,2,3);imshow(I1_min(mid+1:
r1-mid,mid+1:
c1-mid),[]);title('最小值图像');
中值:
I=imread('Lena.bmp');
noise=imnoise(I,'salt');
figure,imshow(noise);
Inew=myMidal(noise,3);
figure,imshow(Inew);
(五)分别使用理想和巴特沃斯高低通滤波器对图像进行滤波(高斯噪声),讨论阈值的设定和阶数的选取。
clc;
I=imread('Lena.bmp');%读图
F=fft2(I);%傅里叶变换,变为频域内的图
newF=fftshift(F);%移频
[MN]=size(I);%获取图像的大小
d0=100;
%M=60;N=60;
c1=floor(M/2);%原点
c2=floor(N/2);
h1=zeros(M,N);%理想型
%h2=zeros(M,N);%巴特沃斯型
%h3=zeros(M,N);%高斯型
%sigma=4;
%n=4;%巴特沃斯阶数
fori=1:
M
forj=1:
N
d=sqrt((i-c1)^2+(j-c2)^2);
ifd<=d0
h1(i,j)=1;%若为低通,则为0
else
h1(i,j)=0;%若为低通,则为1
end
%h2(i,j)=1/(1+(d/d0)^(2*n));
%h3(i,j)=exp(-d^2/(2*sigma^2));
end
end
A=h1.*newF;%相当于Guv
B=ifft2(A);%相当于Gxy
imshow(log(abs(B)),[]);
draw2(h1,'理想型');
%draw2(h2,'巴特沃斯');
%draw2(h3,'高斯');
图像灰度变换
一些常用灰度变换Matlab程序以及图像处理效果图
1,二值化和阈值处理
%图像二值化(选取一个域值,(5)将图像变为黑白图像)
I=imread('C:
\DocumentsandSettings\Administrator\桌面\DIP-E1增强\DIP-E1增强\p12.tif');
bw=im2bw(I,0.5);%选取阈值为0.5
subplot(1,3,1);
imshow(I);
title('原图');
subplot(1,3,2);
imshow(bw);
title('显示二值图像');
J=find(I<150);
I(J)=0;
J=find(I>=150);
I(J)=255;
subplot(1,3,3);
imshow(I);
title('图像二值化(域值为150)');
2非线性变换
%对数变换
I=imread('C:
\DocumentsandSettings\Administrator\桌面\DIP-E1增强\DIP-E1增强\p12.tif');
I=mat2gray(I);%对数变换不支持uint8类型数据,将一个矩阵转化为灰度图像的数据格式(double)
J=log(I+1);
subplot(1,2,1);
Imshow(I);%显示图像
title('原图');
subplot(1,2,2);
Imshow(J);
title('对数变换后的图像')
3,反色变换
I1=imread('C:
\DocumentsandSettings\Administrator\桌面\DIP-E1增强\DIP-E1增强\p12.tif');
figure,imshow(I);
title('原始图像');
I2=imcomplement(I1);
figure,imshow(I2);
title('反色后图像');
4.灰度图像均衡化
I=imread('C:
\DocumentsandSettings\Administrator\桌面\DIP-E1增强\DIP-E1增强\p12.tif');
J=histeq(I);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
figure,subplot(1,2,1),imhist(I,64);
subplot(1,2,2),imhist(J,64);
点检测
myMidal.m
function[d]=myMidal(x,n)
%x是给定的图像,n是滤波器的大小;本函数实现中值滤波
[heigthwidth]=size(x);
x1=double(x);
x2=x1;%x2就是原图像,模板每滑动一次,就用加权平均值修改
fori=1:
width-n+1
forj=1:
heigth-n+1
c=x1(i:
i+n-1,j:
j+n-1);%矩阵n行*n列模板,i:
i+n-1是n行,c就是模板划过的区域
mm=-sum(sum(c))+9*c(1+(n-1)/2,1+(n-1)/2);%第一次求和,是按列求和。
得到一个行向量,,向量的基础上都求和sum,在i行j列中取中间值的坐标是i+(n-1)/2,j+(n-1)/2
%e=reshape(c,1,n*n);%将c变成向量
%mm=median(e);%取中间值
x2(i+(n-1)/2,j+(n-1)/2)=mm;%模板中间坐标,i+(n-1)/2表示行号,j+(n-1)/2是列号
end
end
x3=x2(2:
height-1,2:
width-1);%去掉最外面的一行一列
figure,imshow(uint8(x3));%double是用来计算的,,uint是用来直接显示的
%T=max(max(abs(x3)));%最大梯度的矩阵,每一列求出一个最大值,得到一个行矩阵,再求一次最大值
T=20;
[mn]=size(x3);%比max小的都是0
fori=1:
m
forj=1:
n
if((abs(i,j)) else x3(i,j)=0; end end end d=uint8(x3);%二值图的梯度图 myMidalfiler.m clc; I=imread('flower,jpg'); [mn]=size(I); figure,imshow(I); %I=I(10: m-10,10: n-10);%截取从第10行,到m-10行 %I(60,70)=0%在60行70列加一个黑点,直接赋值为0 %imwrite(I,'flower,jpg'); newI=myMidal(I,3); figure,imshow(newI); 阈值 I1=imread('Cameraman.bmp'); subplot(131);imshow(I1);title('原图'); I=im2bw(I1); subplot(132);imhist(I1);title('直方图'); [mn]=size(I1); fori=1: m forj=1: n if(I1(i,j)>75) I1(i,j)=255;%大于75,都变成背景色 else I1(i,j)=0; end end end subplot(133);imshow(I1);title('分割以后图'); Sobel i=imread('rice1.jpg'); g=rgb2gray(i); d=im2double(i); subplot(131),imshow(i),title('原图'); [gv,t]=edge(g,'sobel',0.075,'horizontal');%I是输入图像,Sobel是运用的方法,parameters是参数 %g是一个数组,t是edge用于确定参数,T是阈值,dir(vertical)是检测的首选方向 subplot(132),imshow(gv),title('水平方向'); [gv,t]=edge(g,'sobel',0.9,'horizontal'); subplot(133),imshow(gv),title('水平方向'); %LOG i=imread('rice1.jpg'); g=rgb2gray(i); d=im2double(i); subplot(131),imshow(i),title('原图'); [gv,t]=edge(g,'log',0.005,2.25); subplot(132),imshow(gv),title('高斯拉普拉斯LOG'); [gv,t]=edge(g,'log',0.1,2.25);%2.25是代表标准差。 默认为2 subplot(133),imshow(gv),title('高斯拉普拉斯LOG'); %Canny i=imread('rice1.jpg'); g=rgb2gray(i); d=im2double(i); subplot(131),imshow(i),title('原图'); [gv,t]=edge(g,'canny',[0.040.1],1.5);%[0.040.1]是两个阈值,1.5是平面滤波的标准差,默认值为1 subplot(132),imshow(gv),title('边缘检测器'); %(三)利用直方图人工指定阈值对rice进行自动单阈值分割; I1=imread('Cameraman.bmp'); subplot(131);imshow(I1);title('原图'); I=im2bw(I1); subplot(132);imhist(I1);title('直方图'); [mn]=size(I1); fori=1: m forj=1: n if(I1(i,j)>75) I1(i,j)=255;%大于75,都变成背景色 else I1(i,j)=0; end end end subplot(133);imshow(I1);title('分割以后图'); %(四)用迭代法和OSTU法对rice进行自动单阈值分割; x=imread('Lena.bmp'); %figure;%imshow(x); [m,n]=size(x); N=m*n; num=zeros(1,256); p=zeros(1,256); fori=1: m forj=1: n num(x(i,j)+1)=num(x(i,j)+1)+1; end end fori=0: 255;p(i+1)=num(i+1)/N; end totalmean=0; fori=0: 255; totalmean=totalmean+i*p(i+1); end maxvar=0; fork=0: 255kk=k+1; zerosth=sum(p(1: kk)); firsth=0; forh=0: k firsth=firsth+h*p(h+1); end var=total
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序