基于MATLAB的图像处理的课程设计

基于MATLAB的图像处理的系统


  1. 课题介绍

数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
MATLAB中集成了功能强大的图像处理工具箱。由于MATLAB语言的语法特征与C语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式,而且这种语言可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。

  1. 课题功能

学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。

以下几点是程序必须实现的功能。

1)图像的读取和保存。

2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。

3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。

4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。

5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。

6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。比较去噪效果。

  1. 总体设计

由于要实现的功能并不是很多,所以在排版的过程中,把各个功能都安排在目录栏上,整体安排如下图所示:

v2-36936e122fea01e26660eda75587bbc2_b.jpg

v2-757aeecf4ba4a74d6e7afb07bb7f3ab6_b.jpg

v2-d2fa15a91622b8b89400cbf7e52afc6f_b.jpg


同时在调节亮度时,虽然可以同对话框的形式输入调节的比例系数,但是这样效果不好了,不容易调节,因此这里考虑用滚动条来调节。因此,总体的设计界面如下图所示:


v2-49cb502f55d52603beb6376747ad5bd3_b.jpg


3.1、文件

3.1.1、打开

为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件,所以设置这里的缺省后缀名为“.bmp”。

Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“name”和“path”中。如果按下取消按钮或是发生错误,则返回值是0。 根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.img。

3.1.2、保存

同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。

3.1.3、退出

退出比较简单,程序如下所示:

clc;

close all;

close(gcf);

6.2编辑

3.2.1、灰度

由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示灰度图像,把三维图像降为二维,可以只取其中的二维数据,实现方法程序为:

y=(handles.img(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)

imshow(y);

但是这样的话,根据程序所选的不同,图像数据也不同,显示也就不一样。

另一种方法就是,运用rgb2gray函数实现彩色图像到灰度图像的转换。程序为:

y=rgb2gray(handles.img);

imshow(y);

这个程序只能用于RGB图像转换灰度图像,当原始图像本来就是灰度图像时,运行该程序时就会出错,但是使用者在使用时有时并不知道这些,为了使该程序更加完善,应该在使用者原先图像时灰度图像时使用该功能时,应该要显示提示类信息。所以在开始时应该要有一个RGB图像或是灰度图像的判断过程。完整的程序如下:

if isrgb(handles.img)

y=rgb2gray(handles.img);

imshow(y);

else

msgbox('这已经是灰度图像','转换失败');

end

如果原图是RGB,执行该操作的结果如下图:


v2-78e8ca2dc0c0a1ddbab447251bee01f6_b.jpg

v2-faa0031e3e0d019e1b40061a9e7ca741_b.jpg


如果原图本身已经是灰度图像了,执行该操作弹出如 右图所示的提示对话框


3.2.2、亮度

用imadjust函数,其调用格式如下:

g=imadust(f,[low_in high_in],[low_out high_out]),gamma)


v2-f431ae27861f2713ac56c242cd2b8765_b.jpg

gamma 表示映射性质,默认值是1 表示线性映射。

由于该函数有五个参数需要输入,为了方便用户改变,所以这里设计一个输入对话框,用户通过对话框把五个参数赋值给[low_in high_in],[low_out high_out],gamma这五个参数,如下一组命令建立了如图所示的输入对话框:

prompt={'输入参数1','输入参数2','输入gamma'};

defans={'[0 0.7]','[0 1]','1'};

p=inputdlg(prompt,'输入参数',1,defans);

但是,这种方法并不能很好的让用户能够对图像进行任意的亮度和对比度变化调整,有时并不事先知道参数的值要多少,也不关心,而是任意调节的,直到满意为止。所以应该用滑动条来调节图像的亮度和对比度,这样更适合用户的使用习惯。

由于imadjust函数有五个参数,所以原则上需要设计五个滑动条来调节对比度,这对用户来说显然比较麻烦,因此在设计的时候固定其中的三个参数,通过调节两个参数的值来改变亮度和对比度。

[0 handles.beta],[0 1],handles.gm,这里的变量handles.beta和handles.gm就通过滑动条得到,滑动条设计如下图:


v2-f80b3bbc32ee1828773a7d7ba282d466_b.jpg


亮度调整的tag名为ld,取值范围0~1,gamma值的tag名为gamma,取值范围为0~5。获取滑动条参数的程序如下:

handles.beta=get(handles.ld,'value');

handles.gm=get(handles.gamma,'value');

执行该操作,调节滑动条到上图所示位置,结果如下图:


v2-c35f32bf5a4e833a8576a9da31a15b23_b.jpg


3.2.3、截图

在MATLAB中,用函数imcrop实现对图像的剪切操作。该操作剪切的是图像中的一个矩形子图,用户可以通过参数指定这个矩形四个顶点的坐标,也可以交互地用鼠标选取这个矩形。

Imcrop函数的调用格式如下:

y=imcrop(handles.img);

不管handles.img是三维的还是二维数据,该函数都能进行操作。下图就是对三维图像的截图:


v2-387e76e5ae016a3b892c0e6eff0a60d7_b.jpg


3.2.4、缩放

在MATLAB中,用函数imresize来实现对图像的放大或缩小。插值方法可选用三种方法,最近邻插值,双线性插值,双三次插值。

该函数的调用格式如下:

B=imresize(A,m,method)

其中:

参数method用于指定插值的方法,可选的值为“nearest”(最近邻法),“bilinear”(双线性插值)、“bicubic”(双三次插值),缺省值为“nearest”。

B=imresizee(A.m,method)表示返回原图A的m倍放大图像(m小于1时实际上是缩小);

下图就是采用邻近插值法的放大和缩小图像,参数值保持默认设置:


v2-e36e91e6ef95d31a4aad8a843e2fbb61_b.jpg


虽然处理后看不出放大的效果,这是由于坐标轴限制的原因,如果把处理后的图片保存起来,再把处理后的文件打开,就可以看到比较明显的放大效果。


v2-5e83158a6b54be816fde9b4fc6288efb_b.jpg


缩小后的结果如下:


v2-7c7e9d575bcc7b93951cfd92a73d1ab0_b.jpg



6.3旋转

3.3.1、上下翻转

函数flipud是实现一个二维矩阵的上下翻转,如

a=[1 2;3 4],经过该函数处理后,原矩阵变为[3 4;1 2];所以利用该函数也可以对图像进行上下翻转处理,但由于该函数针对二维数据的处理,所以在写程序时,要对RGB图像和灰度图像分开处理,这就要用到isrgb函数来判断,如果是灰度图像,则可以直接用这个函数进行处理,否则就要对RGB图像进行降维处理, for k=1:3

y(:,:,k)=flipud(x(:,:,k));

end

处理结果如图:


v2-9e5107379aaa0278c816a534b5a8d9c1_b.jpg



3.3.2、左右翻转

对图像的左右翻转也可以用fliplr函数来处理,同样的,也要对灰度和彩色图像分开处理,处理结果如图:


v2-8c42bda3bcced93d10a661e8b1b6c6f4_b.jpg


3.3.3任意角度翻转

用函数imrotate来实现对图像的插值旋转。

该函数的调用格式如下:

B=imrotate(A,angle,method,’crop’)

其中,参数method用于指定插值的方法,可选的值可以有三种,分别为邻近插值,双线性插值,双三次插值,缺省时为邻近插值,参数angle代表旋转的角度。

一般来说,旋转后的图像会比原图大,用户可以指定“crop”参数对旋转后的图像进行剪切(取图像的中间部分),使返回的图像与原图大小相同。执行结果为:


v2-11ef0d95fc748758e504a50ad23bd225_b.jpg


6.4噪声

经常用到的噪声有三种,高斯噪声,椒盐噪声,乘性噪声,可以通过以下三个函数来实现:

y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声

y=imnoise(x,'salt & pepper',p1); %椒盐噪声

y=imnoise(handles.img,'speckle',p1); %乘性噪声

p1,p2的参数也通过输入对话框的形式得到,原图加入高斯噪声后结果如下所示:


v2-227bc5453ff897559036894feea68625_b.jpg



6.5滤波

这里选择三种滤波方法,

k=medfilt2(handles.noise_img);%中值滤波

k=wiener2(handles.noise_img,[5,5]);%自适应滤波

k=filter2(fspecial('average',3),handles.noise_img)/255;%平滑滤波

同样的,这些函数也是针对二维数据,所以要先判断是彩色图像还是灰度图像,然后分别进行处理,下面是对彩色图像的自适应滤波处理:

i=handles.noise_img;

if isrgb(i)

a=handles.noise_img(:,:,1);

b=handles.noise_img(:,:,2);

c=handles.noise_img(:,:,3);

k(:,:,1)=wiener2(a,[5,5]);

k(:,:,2)=wiener2(b,[5,5]);

k(:,:,3)=wiener2(c,[5,5]);

imshow(k);

执行结果如图:


v2-f1542b0848af044b094a0cb1863c4257_b.jpg


对其他方法的滤波程序也类似,由于把各个滤波方法放在一个选择框里,所以程序要用以下的选择语句:

switch str

case '中值滤波'

case '自适应滤波'

case '平滑滤波'

end

6.6直方图统计

用imhist函数对图像数据进行直方图统计,

x=imhist(handles.img(:,:,1));

bar(horz,x);

其中,x矩阵的数据是0~255灰度值的统计个数,如果直接对x矩阵数据进行图形图显示,由于有256个数据,在坐标系中就会很密集,为了更清楚的显示条形图,所以在程序设计时,把x数据进行部分提取,

x1=x(1:10:256);

horz=1:10:256;

bar(horz,x1);

除了显示数据的直方图统计外,还可以对图像进行均衡处理,所用到的函数是histeq,这两个函数同样只使用于二维数据,所以也要对二维和三维数据分开处理。

直方图显示和均衡后的图像分别如下图所示




v2-25ab34acecbb1c60b95f4bb7a7c28f37_b.jpg

v2-9951ced1ad1e90405d0e0b294fd903de_b.jpg



6.7频谱分析

3.7.1、频谱图

为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC 组件移到光谱中心。这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。如下图所示:


v2-428157e6f13ebd6727ce8e01c6c6fd24_b.jpg


3.7.2、通过高通滤波器

axes(handles.axes2);
x=(handles.img);
if isrgb(x)
    msgbox('这是彩色图像,不能通过高通滤波器','失败');
else
y1=imnoise(x,'gaussian');                  %加高斯噪声
f=double(y1);                           % 数据类型转换
k=fft2(f);                              % 傅立叶变换
g=fftshift(k);                           % 转换数据矩阵
[M,N]=size(g);
nn=2;
d0=3;                                 %截止频率为3
m=fix(M/2); n=fix(N/2);
for i=1:M
        for j=1:N
            d=sqrt((i-m)^2+(j-n)^2); % 计算高通滤波器传递函数
            if d<=d0
                h=0;
            else h=1;
            end
            result(i,j)=h*g(i,j);
        end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);    
end

3.7.3、通过低通滤波器
axes(handles.axes2);
x=(handles.img);
if isrgb(x)
    msgbox('这是彩色图像,不能通过低通滤波器','失败');
else
y1=imnoise(x,'salt & pepper');   % 叠加椒盐噪声
f=double(y1); % 数据类型转换,不支持图像的无符号整型的计算
g=fft2(f);                      % 傅立叶变换
g=fftshift(g);                   % 转换数据矩阵
[M,N]=size(g);
nn=2;                 % 二阶巴特沃斯(Butterworth)低通滤波器
d0=10;                           %截止频率为10
m=fix(M/2); n=fix(N/2);
for i=1:M
       for j=1:N
           d=sqrt((i-m)^2+(j-n)^2);
           h=1/(1+0.414*(d/d0)^(2*nn));% 计算低通滤波器传递函数
           result(i,j)=h*g(i,j);
       end
end
result=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);  % 显示滤波处理后的图像
end


  1. 灰度图像处理


3.8.1、二值图像

用j=im2bw(x);来对灰度图像到二值图像的转换。转换结果为:


v2-a16330e59cb9e9357b03140a15b32961_b.jpg




3.8.2、创建索引图像

用X = grayslice(I,n)函数来实现,转换后得到的图像为:


v2-7eca472f8a3dd58c8a4c3fcf887e03e5_b.jpg



6.8颜色模型转换

下面是RGB颜色模型到HSV模型的转换程序:

axes(handles.axes2);

x=(handles.img);

if isrgb(x)

HSV=rgb2hsv(x);

imshow(HSV);

else

msgbox('这是灰度图像,不能转换','转换失败');

end

转换后的结果为:


v2-fed7c1467b1fa31b27ebcece7863ebcf_b.jpg


同样的,转化为ntsc和ycbcr模型,只要改为相应的函数即可。函数如下:

rgb2ntsc(x);% rgb模型转ntsc模型

rgb2ycbcr(x);% rgb模型转ycbcr模型

6.9操作界面设计

为了使整个操作界面更加的美观,对背景颜色和字体颜色进行设置。

  • 6
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值