基于偏微分方程的图像处理Word格式.docx
《基于偏微分方程的图像处理Word格式.docx》由会员分享,可在线阅读,更多相关《基于偏微分方程的图像处理Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
Image=imread('
graytest2.bmp'
imshow(Image);
[m,n]=size(Image);
image11=Image;
fori=1:
m
forj=1:
n
image12(i,j)=image11(i,n-j+1);
end
end
forj=1:
fori=1:
image21(i,j)=image11(m-i+1,j);
image22(i,j)=image12(m-i+1,j);
image1=[image11,image12];
image2=[image21,image22];
image=[image1;
image2];
figure
imshow(image)
原图像:
扩展图像:
2.把一幅灰度图像的像素值都变换为原来的1/2使图像质量变差,然后利用Matlab图像处理工具箱中的直方图均衡化函数histeq对图像进行增强,输出原图像、质量变差图像和增强后的图像以及它们的直方图。
Image1=0.5*double(Image);
subplot(3,2,1);
subplot(3,2,2);
imhist(Image);
subplot(3,2,3);
imshow(uint8(Image1));
image1=uint8(Image1);
imwrite(image1,'
graytest2_1.bmp'
)
subplot(3,2,4);
imhist(image1);
Image_hist=histeq(image1);
subplot(3,2,5);
imshow(Image_hist);
imwrite(Image_hist,'
graytest2_2.bmp'
subplot(3,2,6);
imhist(Image_hist);
3.图像的水平集、水平线和等高线的显示和处理
(1)显示一幅灰度图像在某一水平的水平集、水平线和等高线;
functionlevel(image_name,N)
%求一图像的水平集、线
%输入参数:
image_name---图像文件名
%:
N--------阀值(0~255)
ifnargin<
1
disp('
请输入文件名!
!
'
return;
elseifnargin<
2
N=128;
image_input=imread(image_name);
imshow(image_input);
原图像'
[size_m,size_n]=size(image_input);
matrix_temp=zeros(size_m,size_n);
%求水平集
forrow=1:
size_m
forcol=1:
size_n
ifimage_input(row,col)>
N
matrix_temp(row,col)=1;
imshow(matrix_temp,[]);
图像的水平集'
imwrite(matrix_temp,'
level_setzhan.bmp'
%图像矩阵扩展赋值便于处理边界
matrix_ex=zeros(size_m+2,size_n+2);
matrix_ex(row+1,col+1)=matrix_temp(row,col);
%四邻域反填充得水平线
matrix_new=matrix_temp;
forrow=2:
size_m+1
forcol=2:
size_n+1
ifmatrix_ex(row+1,col)==0&
matrix_ex(row-1,col)==0&
matrix_ex(row,col+1)==0&
matrix_ex(row,col-1)==0
matrix_new(row-1,col-1)=1;
imshow(matrix_new,[]);
图像的水平线'
%imwrite(matrix_new,'
level_line.bmp'
%求图像的等高线
contour=zeros(size_m,size_n);
ifimage_input(row,col)==N
contour(row,col)=1;
contour(row,col)=1-contour(row,col);
imshow(contour,[]);
图像的等高线'
%imwrite(contour,'
contour.bmp'
functionlevel_line_set(image_name)
%求一图像的阀值N取各值所对应的水平线的叠加
%输入参数:
%不变量
matrix_out=zeros(size_m,size_n);
%循环中不需重新初始化的变量
%输出矩阵初始化(白)
matrix_out(row,col)=1;
%扩展矩阵
subplot(1,2,1);
forN=1:
32:
255%N为相应阀值
matrix_temp=zeros(size_m,size_n);
%重新初始化(黑)
forrow=1:
size_m
=N
%求水平集-----
end
%图像矩阵扩展赋值便于处理边界
%四邻域(黑区域填白)反填充得水平线
matrix_new=matrix_temp;
forrow=2:
%填白
matrix_out=min(matrix_out,matrix_new);
%各级水平线叠加
matrix_out(1,1)=0;
matrix_out(2,1)=1;
subplot(1,2,2);
imshow(matrix_out,[]);
图像部分水平集的叠加'
level('
100);
(2)显示图像并显示它的一族水平线(要求阀值
为32,64,96,128,160,192,224)。
255%N为相应阀值(要求阀值
4.显示一幅灰度图像及其加高斯白噪声(
)和椒盐噪声(噪声密度
)后的图像及直方图。
functionnoise(filename)
Image=imread(filename);
imshow(Image,[]);
%原图像
noise_g=imnoise(Image,'
gaussian'
%增加高斯白噪声
imshow(noise_g,[]);
%imwrite(noise_g,'
noise_g.bmp'
高斯白噪声'
noise_s=imnoise(Image,'
salt&
pepper'
imshow(noise_s,[]);
黑白象素点噪声(椒盐)'
%imwrite(noise_s,'
noise_s.bmp'
noise_p=imnoise(Image,'
speckle'
imshow(noise_p,[]);
%imwrite(noise_p,'
noise_p.bmp'
乘积性噪声'
0,0.01);
imwrite(noise_g,'
graytest2_g.bmp'
imhist(noise_g);
0.02);
imwrite(noise_s,'
graytest2_s.bmp'
imhist(noise_s);
5.分别利用算术平均滤波、加权的线性光滑和热传导方程滤波方法对4题中得到的两幅噪声图像进行去噪处理。
算术平均滤波:
functionaver_filter(Image_name,N,out_filename)
%非线性平滑滤波器G1平均
%输入参数文件名N为模板大小(正奇数)
%读取图像-------------
3
输入参数错误!
!
image=imread(Image_name);
ifisrgb(image)
image=rgb2gray(image);
%图像扩展--------------
[size_m,size_n]=size(image);
image_ex=zeros(size_m+N-1,size_n+N-1);
%赋值
size_n
image_ex(row+(N-1)/2,col+(N-1)/2)=image(row,col);
%对每个象素------------------
pattern_plate=zeros(N,N);
%模板
image_new=zeros(size_m,size_n);
%滤后图像矩阵
%取模板的元素
forrow_p=1:
N
forcol_p=1:
pattern_plate(row_p,col_p)=image_ex(row+row_p-1,col+col_p-1);
%求模板的平均值得滤后图像矩阵
image_new(row,col)=mean2(pattern_plate);
%输出---------------
imshow(image_new,[]);
滤后图像'
imwrite(uint8(image_new),out_filename)
加权线性光滑:
functionweight_filter(Image_name,flag,out_filename)
%用各模板进行去噪和锐化
%输入参数Image_name文件名
%flag模板类型标志1~4
请按参数格式输入参数!
ifflag~=1&
flag~=2&
flag~=3&
flag~=4
参数flag输入错误!
N=3;
%各类模板
ifflag==1
pattern_plate=[1/91/91/9;
1/91/91/9;
1/91/91/9];
elseifflag==2
pattern_plate=[1/161/81/16;
1/81/41/8;
1/161/81/16];
%平滑滤波器
elseifflag==3
pattern_plate=[0-10;
-15-1;
0-10];
%反锐化掩蔽滤波器
elseifflag==4
A=1.7;
-1A+5-1;
%高提升滤波器
%读取图像----------
image_I=imread(Image_name);
ifisrgb(image_I)
image_I=rgb2gray(image_I);
imshow(image_I,[]);
%图像扩展--------------
[size_m,size_n]=size(image_I);
%赋值
image_ex(row+(N-1)/2,col+(N-1)/2)=image_I(row,col);
%对每个象素------------------
temp_plate=zeros(N,N);
%取模板的元素
temp_plate(row_p,col_p)=image_ex(row+row_p-1,col+col_p-1);
image_new(row,col)=sum(sum(temp_plate.*pattern_plate));
%输出---------------
imshow(uint8(image_new));
滤波后图像'
imwrite(uint8(image_new),out_filename);
热传导方程滤波:
functionHeat_Equation(image_name,t,out_filename)
%热传导方程[Ut=U0+t*Delta(U0)]
%image_name:
原图像文件名
%t:
迭代次数
%out_filename:
输出文件名
image_I=imread(image_name);
mkdir('
Heat_Eq'
%新建文件夹以存放过程文件
cd('
[size_r,size_c]=size(image_I);
image_I=double(image_I);
if(t>
0)
N=t/0.1;
else
N=(-t)/0.1%每次叠代的步长为0.1
end
forindex=1:
N
image_ex=matrix_expand(image_I);
%边界拓展
diff_two_order=zeros(size_r,size_c);
size_r+1
size_c+1
diff_two_order(row-1,col-1)=-4*image_ex(row,col)+image_ex(row-1,col)+image_ex(row+1,col)+image_ex(row,col-1)+image_ex(row-1,col+1);
if(t>
image_I=image_I+0.1*diff_two_order;
else
image_I=image_I-0.1*diff_two_order;
imwrite(uint8(image_I),strcat('
Heat_Eq_'
num2str(index),'
.bmp'
));
..'
imshow(uint8(image_I));
ift>
title('
热传导方程光滑后图像'
Gabor锐化后的图像'
imwrite(uint8(image_I),out_filename);
%-------------------------end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
functionmatrix_ex=matrix_expand(matrix)
%对矩阵进行延拓
[size_r,size_c]=size(matrix);
matrix_ex=zeros(size_r+2,size_c+2);
%中
size_r
size_c
matrix_ex(row+1,col+1)=matrix(row,col);
%左,右
for