实验一:图像文件读取和格式转换(BMP、JPG),FMRI_MRI并利用Matlab编程,实现多种格式图像的读取,显示和格式转换
一、实验目的
学习并掌握MATLAB中有关图像读取、显示、格式转换等基本内容。
二、实验内容
选取目标图片,利用MATLAB对其进行读取、显示、格式转换。
三、实验步骤及各自结果
1图像的读取和显示
图像来自于E:\实验,图像名称为“mri.bmp”,为bmp格式。
(1)创建脚本文件,并命名为“tx1”。
(2)图像的读取和显示
用imread函数实现图像的读取,imshow函数实现图像的显示。
所读取得灰度图像如下:
(3)格式转换
将灰色图像转换成索引图像
索引图像如下:
灰度图像转二值图像
二值图像如下
实验二:图像的直方图调整和灰度变换
一、实验目的
了解并掌握MATLAB中图像直方图调整和灰度变换。
二、实验内容
选取目标图片,利用MATLAB对其进行直方图调整和灰度变换。
三、实验步骤及其各自的结果
1创建脚本文件并命名为“tx2”。
2图像灰度调整
利用imadjust函数直接调整灰度的范围而调整灰度,本例中直接利用MATLAB R2012a工具箱中自带的图片‘pout.tif’,‘cameraman.tif’和课堂提供的图片‘fmri.bmp’。
(1)下面命令通过灰度范围调整实现了灰度调整
实验结果如下图所示
其中左上图为原始图像,左下图为相应的灰度数据柱状统计图,右上图为调整后的图像,右下图为相应的灰度数据统计图。从图中可以看到,调整之后,图像的灰度得到了极大的改善。
如下图
(3)可以通过调整灰度范围内的灰度子范围数据,来实现增强或减少图像对比度
的效果。
此例中将灰度范围为[0,51]的值,调整到灰度范围为[128,255]的值,并将灰度范围为[128,255]的值映射为255;相应的命令如下所示
如下图所示
(4)图像反转
反转后结果
2使用直方图调整灰度
读取一幅灰度图像,用histeq函数将原始图像的灰度直方图均衡化,同时观察均衡化后的图像与前面图像的差别,均衡化后的灰度直方图与前面的灰度直方图的区别。
实验结果如下图所示
实验三:图像的变换和频域滤波
一、实验目的
掌握图像快速傅里叶变换原理、频域低通滤波器的设计。进一步加深理解和掌握图像频谱的特点和频域低通滤波的原理。
二、实验内容
设计程序,实现图像的快速傅里叶变换和截止频率半径分别为5、10、20、40理想低通滤波器对图像的滤波处理。观察处理前后图像效果,分析实验结果和算法特点。
三、实验原理
二维理想低通滤波器的传递函数为:
00
1.(,)(,)0.(,)D u v D H u v D u v D ≤?=?>?D0是指定非负数值,D (u ,v )是(u ,v )点距频率中心的距离。如果要研究的图像尺寸为M X N ,则它的变换也有相同的尺寸。在半径为D0的圆内,所有频率无衰减地通过滤波器,而在此半径之外的所有频率完全被衰减掉。
四、实验步骤
1图像的快速傅立叶变换。
在Edit 编辑器内输入如下程序(程序见附1)
先产生的是一维FFT 结果,后产生的是二维FFT
的结果。
2频域实现低通滤波。
图1截止频率半径为5的低通滤波
图2截止频率半径为10的低通滤波
图3截止频率半径为20的低通滤波
图4截止频率半径为40的低通滤波
附1:程序源代码
I=imread('pout.tif');
figure(1),subplot(1,3,1),imshow(I);
I1=I;
I2=I;
i=sqrt(-1);
m=nextpow2(291);
n=240;
N=2^m;
for p=1:1:n
if291 x=[I(p*291-290:p*291),zeros(1,N-291)]; x=im2double(x); end nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; y=x(nxd); for mm=1:m Nmr=2^mm; u=1; WN=exp(-i*2*pi/Nmr); for j=1:Nmr/2 for k=j:Nmr:N kp=k+Nmr/2; q=(y(kp))*u; y(kp)=y(k)-q; y(k)=y(k)+q; end u=u*WN; end end Y1=fftshift(y); Y2=abs(Y1); Y3=im2uint8(Y2); I1(p*291-290:p*291)=Y3(1:291); end subplot(1,3,2),imshow(I1); m=nextpow2(240); n=291; N=2^m; for p=1:1:n for t=1:1:240 T(t)=I1(t*291-290+p-1); end if240 x=[T(1:240),zeros(1,N-240)]; else x=T; end x=im2double(x); nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; y=x(nxd); for mm=1:m Nmr=2^mm; u=1; WN=exp(-i*2*pi/Nmr); for j=1:Nmr/2 for k=j:Nmr:N kp=k+Nmr/2; q=(y(kp))*u; y(kp)=y(k)-q; y(k)=y(k)+q; end u=u*WN; end end Y1=fftshift(y); Y2=abs(Y1); Y3=im2uint8(Y2); for t=1:1:240 I2(t*291-290+p-1)=Y3(t); end end subplot(1,3,3),imshow(I2); 附2:程序源代码 (1)理想低通滤波器(以D0=5为例) I1=imread('pout.tif'); imshow(I1); title(I1);%将灰度图像的二维不连续Fourier变换的零频率成分移到频谱的中心s=fftshift(fft2(I1)); [M,N]=size(s);%分别返回s的行数到M中,列数到N中 n1=floor(M/2);%对M/2进行取整 n2=floor(N/2);%对N/2进行取整 %ILPF滤波,d0=5,10,20,40(程序中以d0=5为例) d0=5;%初始化d0 for i=1:M for j=1:N d=sqrt((i-n1)^2+(j-n2)^2);%点(i,j)到傅立叶变换中心的距离 if d<=d0%点(i,j)在通带内的情况 h=1;%通带变换函数 else%点(i,j)在阻带内的情况 h=0;%阻带变换函数 end s(i,j)=h*s(i,j);%ILPF滤波后的频域表示 end end s=ifftshift(s);%对s进行反FFT移动 s=uint8(real(ifft2(s)));%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数 figure;%创建图形图像对象 subplot(122);imshow(s) subplot(121);imshow(I1) 实验结果分析:(1)对于理想的低通滤波器,当截止频率D0较低的时候,图像严重模糊,被滤去的高频部分的能量包含了图像的主要的边缘信息,同时振铃效应也非常的明显。随着截止频率的增加,模糊地程度减少,这是因为保留的边缘信息增加了。 实验四:磁共振大脑断层图像的边界提取(MRI) 一、实验目的 了解有关数字图像边界提取的基本概念,熟悉Matlab软件中关于数字图像边界提取的基本命令,掌握利用Matlab软件进行数字图像边界提取的方法。二、相关知识 在图像处理中,有一种十分实用的操作叫做边界提取,在提取了图像的边界后,就可以对图像进行进一步的操作如图像分割,特定区域的提取,骨架提取等等。 常用的边界检测算子有微分算子、拉普拉斯高斯算子和canny算子。 在MATLAB中,系统提供edge函数,其功能是利用各种边界检测算子来检测灰度图像的边界。 函数edge的用法有以下几种: 1.BW=edge(I); 2.BW=edge(I,method); 3.BW=edge(I,method,thresh); 4.BW=edge(I,method,thresh,direction) 其中: I:输入图像; method:提取边界的方法,共有六种可取的值,即共有六种可使用的方法,包括:’sobel’,’prewitt’,’roberts’,’log’,’zerocross’,’canny’,缺省时使用’sobel’; thresh:指定的阈值,所有不强于thresh的边都被忽略; direction:对于’sobel’和’prewitt’方法指定方向,可取值为:’horizontal’ 和’vertical’,’both’(缺省值) BW:返回的二值图像,其中1代表找到的边界。 在这些方法中,canny是较为优秀的一种,该方法使用两种不同的阈值分别检测强边界和弱边界,并且仅当弱边界和强边界相连时,才将弱边界包含在输出图像中。因此,这种方法不容易被噪声干扰,更容易检测到真正的弱边界。三、实验步骤 分别调用’sobel’,’prewitt’,’roberts’,’log’,’zerocross’和’canny’六种方法检测图像的边界。程序如下: (1)I=imread('E:\实验\fmri.bmp'); BW1=edge(I,'sobel'); figure; imshow(BW1); (2)I=imread('E:\实验\fmri.bmp'); BW2=edge(I,'prewitt'); figure; imshow(BW2); (3)I=imread('E:\实验\fmri.bmp'); BW3=edge(I,'roberts'); figure; imshow(BW3); (4)I=imread('E:\实验\fmri.bmp'); BW4=edge(I,'log'); figure; imshow(BW4); (5)I=imread('E:\实验\fmri.bmp'); BW5=edge(I,'zerocross'); figure; imshow(BW5); (6)I=imread('E:\实验\fmri.bmp'); BW6=edge(I,'canny'); figure; imshow(BW6); 四、实验结果: 图1原始图像 图2sobel算子提取的边界 图3prewitt算子提取的边界 图4roberts算子提取的边界 图5zerocross算子提取的边界 图6log算子提取的边界 图7canny算子提取的边界 五、实验结果 从上面结果我们可以看出,canny算子提取的边界较为完整。