数字图像处理实验_1

数字图像处理实验——基本操作

  • 1 基本图像操作
    • 1.1 试验目的
    • 1.2 试验内容
      • 1 显示图像
      • 2 基本图像处理
      • 3 体会溢出
      • 4 索引图像
      • 5 【思考题】
      • 6 体会对数函数变换
      • 7 【思考题】
    • 1.3 实验结果
    • 1.4 问题与建议
  • 2 应用系统设计
    • 2.1 试验内容
    • 2.2 实验结果
    • 2.3 问题与建议
  • 3 体会图像的傅立叶变换
    • 3.1 试验目的
    • 3.2 试验内容
    • 3.3 实验结果
      • 1 正弦曲线
      • 2 矩形亮斑
      • 3 照片傅里叶变换与反变换
    • 3.4 问题与建议
  • 4 体会2D傅立叶变换的性质
    • 4.1 试验目的
    • 4.2 试验内容
      • 1 旋转特性
      • 2 线性性
      • 3 平移特性
      • 4 卷积与卷积定理
    • 4.3 实验结果
      • 1 旋转特性
      • 2 线性性
      • 3 平移特性
      • 4 卷积定理
    • 4.4 问题与建议
  • 6 实践题
    • 6.1 试验内容
    • 6.2 实验结果
      • 1 同态滤波
      • 2 斑点图像处理
    • 6.3 问题与建议

这是一份作业实录,每个实验写成了一个.m文件,序号不一致的缺了几个的就是放弃没做的。。。在线卑微.jpg

1 基本图像操作

1.1 试验目的

体会基本图像操作,如显示,简单运算等。体会RGB图像与索引图像的不同。

1.2 试验内容

1 显示图像

显示lena.bmp图像,trees.tif图像【描述你看到的内容,注意是灰度图像还是彩色图像】。在当前试验目录“E:\DIP\Project01\”下有若干图像,试显示它们。

2 基本图像处理

读入“len.tif”图像,使用常值255减去图像的所有像素,显示结果,并将结果存储为antilena.tif【图像文件】【脚本文件】。

3 体会溢出

对1.2.2进行其它操作使其超出0到255范围,如何调整显示使你能观察到溢出现象【脚本文件】【图像文件】?

4 索引图像

读入orchid24bits.bmp,orchid8bits.bmp,orchid6bits.bmp,orchid4bits.bmp看数据矩阵的维数以及颜色表有何不同?使用不同的方法显示它们,你能给出一种显示方法显示的结果是错误的吗?将真彩色图像redmountain6bits.bmp转换成有64个颜色的索引图像,并用其颜色表显示orchid6bits.bmp【脚本文件】。

5 【思考题】

使用uint8转换,为什么看不到溢出效果?

6 体会对数函数变换

对wom01.gif进行对数变换【图像文件】【脚本文件】。

7 【思考题】

对图像处理的中间结果,与存储图像进行对数变换,效果有什么不同?试编制一个处理过程的例子演示两种结果,并说明原因。

1.3 实验结果

1 显示图像
lena.bmp是灰度图像,trees.tif是彩色图像。
2 基本图像处理

% pro1_1.2 基本图像处理
lena = imread('lena.tif');
antilena = 255-lena;
subplot(2,2,3)
imshow(antilena);
xlabel('c).antilena.tif');
imwrite(antilena,'antilena.tif');

3 体会溢出

% pro1_1.3 体会溢出
ovflena = 150+lena;
subplot(2,2,4)
imshow(ovflena);
xlabel('d).溢出lena.tif');

4 索引图像
矩阵维数:orchid24bits的矩阵维数为3,orchid8bits、orchid6bits、orchid4bits的矩阵维数为2。
颜色表:orchid24bits 的颜色表是空的,orchid8bits、orchid6bits、orchid4bits的颜色表都为256x3的矩阵。
错误的显示:orchid24bits使用了其他的colormap也不会发生显示错误,但其他三种只要不使用原本的colormap就会出现颜色显示的错误。

% pro1_1.4 索引图象
[orchid24bits,map1] = imread('orchid24bits.bmp');
[orchid8bits,map2] = imread('orchid8bits.bmp');
[orchid6bits,map3] = imread('orchid6bits.bmp');
[orchid4bits,map4] = imread('orchid4bits.bmp');

figure(2);
subplot(2,4,1);imshow(orchid24bits,map1);xlabel('a).orchid24bits');
subplot(2,4,2);imshow(orchid8bits,map2);xlabel('b).orchid8bits');
subplot(2,4,3);imshow(orchid6bits,map3);xlabel('c).orchid6bits');
subplot(2,4,4);imshow(orchid4bits,map4);xlabel('d).orchid4bits');
subplot(2,4,5);imshow(orchid24bits,spring);xlabel('e).orchid24bits(spring)');
subplot(2,4,6);imshow(orchid8bits,summer);xlabel('f).orchid8bits(summer)');
subplot(2,4,7);imshow(orchid6bits,autumn);xlabel('g).orchid6bits(autumn)');
subplot(2,4,8);imshow(orchid4bits,winter);xlabel('h).orchid4bits(winter)');

6 体会对数函数变换

% 体会对数变换
wom01_orig = imread('wom01.gif');
wom01_orig = im2double(wom01_orig)
wom01_gray =mat2gray(log(1+ wom01_orig)); 
figure(6) 
subplot(1,2,1);  
imshow(wom01_orig);  
xlabel(' a). 原始图像');  
subplot(1,2,2);  
imshow(wom01_gray,[]);   % 自动调整数据的范围以便于显示 
xlabel(' b). 对数变换');  

1.4 问题与建议

将图像用imread读入以后,要用im2double将图像转化为双精度类型,以便后续的处理;
使用imread可以将图像以及其颜色图一起读入,而要正确显示图像,就要保证其使用了正确的颜色图,此外matlab中本身含有许多颜色图,颜色图是由介于 0 和 1 之间的值组成的矩阵,用于定义诸如曲面、图像以及补片之类的图形对象的颜色。matlab通过将数据值映射到颜色图中的颜色来绘制这些对象。颜色图可以为任意长度,但宽度必须为三列。矩阵中的每一行均使用 RGB 三元组定义一种颜色。RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度必须在 [0, 1] 范围内。值0表示无颜色,值1表示全强度。

2 应用系统设计

2.1 试验内容

用两个不同品牌的数码相机给自己拍两张照片,注意使用不进行光学变焦(广角模式)和数码变焦情况下的最高分辨率,并且用作业中的程序均匀地拉伸你自己的照片的灰度范围【图像文件】【函数文件】。注意体会将你自己的照片输入你自己的程序的全过程。使用你想象出来的算法处理你的照片,并说明处理结果【图像文件】【函数文件】【说明】。保留这张照片,在以后的作业程序中作为处理对象。

2.2 实验结果

% pro1_2 应用系统设计
bd = imread('building.jpg');
bd_g = rgb2gray(bd);
bd_g = im2double(bd_g);
bd_gn = (bd_g-min(min(bd_g)))/(max(max(bd_g))-min(min(bd_g)));
subplot(1,3,1);imshow(bd);xlabel('building');
subplot(1,3,2);imshow(bd_g);xlabel('灰度图像');
subplot(1,3,3);imshow(bd_gn);xlabel('灰度拉伸'); imwrite(bd_gn,'building_g.jpg');

2.3 问题与建议

此实验我选择了一幅景物图片,该图片的灰度图像对比度较弱,能比较明显的看出灰度拉伸的现象。

3 体会图像的傅立叶变换

3.1 试验目的

生成一些典型图像,计算其傅立叶变换,显示傅立叶变换的幅值图和相角图。

3.2 试验内容

1 生成若干频率的沿行方向的正弦曲线【如果你无法生成,请使用sin01.tif】;求其傅立叶变换;求其幅值图,不平移,但需要log(1+x)增强,并归一化为uint8的数据【图像文件】;求其相角图以-Pi到Pi归一化到uint8的数据【图像文件】。【给出完成以上操作的脚本文件,并注明各中间结果置于何变量名中】
2 生成矩形亮斑【如果你无法生成,请使用bar01.tif】;求其平移后的幅值图(平移增强)uint8数据【图像文件】;求其相角图以-Pi到Pi归一化到uint8的数据【图像文件】。【给出完成以上操作的脚本文件,并注明各中间结果置于何变量名中】
3 对您的照片进行傅立叶变换,按1.2.2显示幅值图和相角图,并对其进行反变换看如何得到您的照片?【给出完成以上操作的脚本文件,并注明各中间结果置于何变量名中】
4 【思考题】对于1.2.1使用生成的正弦图案得到傅立叶变换的幅值图和使用sin01.tif得到傅立叶变换的幅值图有何区别?为什么?

3.3 实验结果

1 正弦曲线

% pro1_3.1 沿行方向的正弦曲线的傅里叶变换
figure(1);
I1 = imread('sin01.tif');I1 = im2double(I1);
F1 = fft(I1')';  % 傅里叶变换
S1 = log(abs(F1)+1); % 幅值
S1=(S1-min(min(S1)))/(max(max(S1))-min(min(S1)));
S1 = im2uint8(S1); imwrite(S1,'幅值图.tif');
P1 = angle(F1); % 相角
P1=(P1-min(min(P1)))/(max(max(P1))-min(min(P1)));
P1 = im2uint8(P1); imwrite(P1,'相角图.tif');
subplot(1,3,1);imshow(I1,[]);xlabel('a).原始图像');
subplot(1,3,2);imshow(S1,[]);xlabel('b).幅值图');
subplot(1,3,3);imshow(P1,[]);xlabel('c).相角图');

2 矩形亮斑

% pro1_3.2 矩形亮斑的傅里叶变换
figure(2);
I2=imread('bar01.tif');
I2=im2double(I2);
F2=fft2(I2')';

S21=log(abs(F2)+1); 
S21=(S21-min(min(S21)))/(max(max(S21))-min(min(S21)));
P21=angle(F2);
P21=(P21-min(min(P21)))/(max(max(P21))-min(min(P21)));

subplot(3,2,1),imshow(I2),xlabel('a).原始图像');
subplot(3,2,3),imshow(S21,[]),xlabel('b).幅值图');
subplot(3,2,4),imshow(P21,[]),xlabel('c).相角图');

F22=fftshift(F2);          % 平移增强
S22=log(abs(F22)+1); 
S22=(S22-min(min(S22)))/(max(max(S22))-min(min(S22)));
S22 = im2uint8(S22); imwrite(S22,'bar幅值图.tif');
P22=angle(F22);
P22=(P22-min(min(P22)))/(max(max(P22))-min(min(P22)));
P22 = im2uint8(P22); imwrite(P22,'bar相角图.tif');

subplot(3,2,5),imshow(S22,[]),xlabel('d).平移后的幅值图');
subplot(3,2,6),imshow(P22,[]),xlabel('e).平移后的相角图');

3 照片傅里叶变换与反变换

% pro1_3.3 图像的傅里叶变换和反变换
figure(3);
I3 = imread('lena.bmp');
I3 = im2double(I3);
F3 = fft(I3);          % 傅里叶变换
S3=abs(F3); 
P3=angle(F22);
subplot(2,2,1),imshow(I3,[]),xlabel('a).原始图像');
subplot(2,2,3),imshow(S3,[]),xlabel('b).幅值图');
subplot(2,2,4),imshow(P3,[]),xlabel('c).相角图');

IF3 = ifft(F3);
subplot(2,2,2),imshow(IF3,[]),xlabel('e).反变换结果');

3.4 问题与建议

自然图像傅里叶变换后的幅值图能量主要集中在左上角,要经过fftshift将其平移到中间,实验结果可见此平移不会改变相角图;
为了方便我们常常会对幅值图和相角图做一些增强处理和归一化处理,但是在实验3.3傅里叶反变换进行图像恢复时,如果对幅值图和相角图进行了变换,之后再进行反变换,就无法恢复到原图像。

4 体会2D傅立叶变换的性质

4.1 试验目的

生成一些典型图像,或对一些典型图像作典型操作,计算其傅立叶变换,显示傅立叶变换的幅值图和相角图。

4.2 试验内容

1 旋转特性

对1.2.2的矩形亮斑进行旋转【如果你无法生成,请使用bar02.tif】;重复上述1.2.2内容。

2 线性性

将1.2.2的矩斑与2.2.1的矩斑按0.25和0.75的加权系数叠加【如果你无法生成,请使用bar03.tif】;重复上述1.2.2内容。请对比直接将1.2.2和2.2.1的结果的幅值谱按该比例叠加,所得的幅值图有何不同?如果这个例子不典型,试给出一个更典型的例子。【选做】

3 平移特性

对2.2.1的矩形亮斑进行平移【如果你无法生成,请使用bar04.tif】;重复上述1.2.2内容。

4 卷积与卷积定理

试设计一个试验过程验证卷积定理。并且体会在空域做卷积和频域应用卷积定理,其结果是否相同?

4.3 实验结果

1 旋转特性

% pro1_4.1 旋转特性
figure(1);
I1=imread('bar01.tif');
I1=im2double(I1);
F1=fft2(I1')';
F1=fftshift(F1); 
S1=log(abs(F1)+1); 
S1=(S1-min(min(S1)))/(max(max(S1))-min(min(S1)));
P1=angle(F1);
P1=(P1-min(min(P1)))/(max(max(P1))-min(min(P1)));
subplot(2,3,1);imshow(I1,[]);xlabel('a).bar01');
subplot(2,3,2);imshow(S1,[]);xlabel('b).幅值图');
subplot(2,3,3);imshow(P1,[]);xlabel('c).相角图');

I2=imread('bar02.tif');
I2=im2double(I2);
F2=fft2(I2')';
F2=fftshift(F2); 
S2=log(abs(F2)+1); 
S2=(S2-min(min(S2)))/(max(max(S2))-min(min(S2)));
P2=angle(F2);
P2=(P2-min(min(P2)))/(max(max(P2))-min(min(P2)));
subplot(2,3,4);imshow(I2,[]);xlabel('e).旋转后的bar01');
subplot(2,3,5);imshow(S2,[]);xlabel('f).幅值图');
subplot(2,3,6);imshow(P2,[]);xlabel('g).相角图');

2 线性性

% pro1_4.2 线性性
I03=imread('bar03.tif');
I03=im2double(I03);
F03=fft2(I03')';
F03=fftshift(F03); 
S03=log(abs(F03)+1); 
S03=(S03-min(min(S03)))/(max(max(S03))-min(min(S03)));
SS = 0.25*S1+0.75*S2;
SS=(SS-min(min(SS)))/(max(max(SS))-min(min(SS)));
figure(2);
subplot(1,2,1);imshow(S03,[]);xlabel('a).bar03幅值图');
subplot(1,2,2);imshow(SS,[]);xlabel('b).直接叠加的幅值图');

3 平移特性

% pro1_4.3 平移特性
figure(3);

subplot(2,3,1);imshow(I2,[]);xlabel('a).bar02');
subplot(2,3,2);imshow(S2,[]);xlabel('b).幅值图');
subplot(2,3,3);imshow(P2,[]);xlabel('c).相角图');

I3=imread('bar04.tif');
I3=im2double(I3);
F3=fft2(I3')';
F3=fftshift(F3); 
S3=log(abs(F3)+1); 
S3=(S3-min(min(S3)))/(max(max(S3))-min(min(S3)));
P3=angle(F3);
P3=(P3-min(min(P3)))/(max(max(P3))-min(min(P3)));
subplot(2,3,4);imshow(I3,[]);xlabel('e).平移后的bar02');
subplot(2,3,5);imshow(S3,[]);xlabel('f).幅值图');
subplot(2,3,6);imshow(P3,[]);xlabel('g).相角图');

4 卷积定理

% pro1_4.4 2D傅里叶变换的性质——卷积定理
I2 = imread('lena.bmp');
I2 = im2double(I2);size_I = size(I2);
h = fspecial('gaussian',size_I,3);

figure(4);
g = conv2(I2,h,'same');           % 在空域做卷积,即对lena高斯模糊

subplot(1,3,1);imshow(I2);xlabel('a).原始图像');
subplot(1,3,2);imshow(g);xlabel('b).空域内卷积');

I_f = fft2(I2);                % 在频域做两个傅里叶变换的乘法,再反变换
h_f = fft2(h);
g_f = I_f.*h_f;
g_fi = ifft2(g_f);
g_fi = fftshift(g_fi);
subplot(1,3,3);imshow(g_fi);xlabel('c).频域内相乘');

4.4 问题与建议

在验证线性性的实验中,实验结果显示其图像大致相同,但是先空域叠加的图像bar03的幅值图相比于直接幅值图同比例加权叠加的图像,出现了更多抖动,这应该是由于bar03含有相角信息而两个幅值图的直接加权求和不含有相角信息的原因造成的;
在验证卷积定理的实验中,我采用了lena的图像与高斯模板空域内卷积和频域内相乘结果比较的方法,二者结果应该都是对原始图像lena进行高斯模糊,但是相比之下,空域卷积的结果在图像四周有一圈黑边,频域相乘的结果则没有,这应该是由于我所采用的卷积conv2(… , same),以至于高斯模板四周的0参与运算所导致出现的。

6 实践题

6.1 试验内容

1 给定图像son1.gif和son2.gif,你将采用哪些手段,将图中的文字增强出来?
2 给定图像dot.jpg为一纸张的数字图像,其上有斑点污染,试设计一个图像处理算法,将斑点的位置和范围确定出来。处理算法的输出为一黑白二值图像,没有斑点的地方为黑,斑点所在的区域为白【图像文件】【脚本文件】。

6.2 实验结果

1 同态滤波

待处理图片的照射分量为按空间分布变化缓慢的低频信号,反射分量为以边缘和细节为主的高频信号。我们可以通过取对数,将照度分量和反射分量分解成为两个分量的对数和,之后进行傅里叶变换,并设计合适的频域滤波器,将滤波结果反变换到空域就得到了我们所需要提取出来的图片中的文字部分。

2 斑点图像处理

clear;clc
% 显示斑点二值图像
dot = imread('dot.jpg');
dot_g = rgb2gray(dot);
figure(1);imhist(dot_g);title('dot.jpg的灰度图像的直方图');
figure(2);
subplot(2,2,1);imshow(dot_g);xlabel('a).灰度图像');
dot_1 = imadjust(dot_g,[0 0.8],[]);
subplot(2,2,2);imshow(dot_1);xlabel('b).调整灰度范围');
dot_2 = im2bw(dot_1);
subplot(2,2,3);imshow(dot_2);xlabel('c).二值化处理');
dot_a = 1-dot_2;
subplot(2,2,4);imshow(dot_a);xlabel('d).反相结果');
imwrite(dot_a,'dot_abw.jpg');

6.3 问题与建议

确定斑点污染的范围有很多可以实现的途径,此处选择了较为简单的处理方法,因为目标仅仅为一个孤立斑点,所以没有必要采用二值图像的形态学处理方式,若为更为复杂的图像则可以采用腐蚀、膨胀、开运算和闭运算等形态学处理。

你可能感兴趣的:(matlab,matlab,数字图像处理)