今天开始学习冈萨雷斯的《数字图像处理》。本文主要记录书中的例题,以便今后学习参考。
-----------------------------------------------------------20180619-----------------------------------------------------
例2.1 读入和显示图像。
>> f=imread('路径'); %从磁盘读入,提取图像的基本信息
>>whos f
>>imshow(f)
>>figure,imshow(f) %保留第一张图,显示第二张
>>imwrite(f,'路径+文件名','tif') %保存f到别的地方
例2.2 图像压缩,图像的一些信息显示
>> g=imread('C:\t.jpeg');
>> imwrite(g,'tt.jpeg','quality',25)
>> imwrite(g,'C:\tt.jpeg','quality',25)
>> imwrite(g,'C:\tt.jpeg','quality',5)
>> imfinfo C:\tt.jpeg %imfinfo 的两种不同用法,还有一种是结构体 命令-函数二元性的例子
ans =
Filename: 'C:\tt.jpeg'
FileModDate: '19-Jun-2018 23:44:24'
FileSize: 5823
Format: 'jpg'
FormatVersion: ''
Width: 550
Height: 306
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
还可以结构体形式
>> K=imfinfo('C:\t.jpeg')
K =
Filename: 'C:\t.jpeg'
FileModDate: '19-Jun-2018 23:37:15'
FileSize: 22867
Format: 'jpg'
FormatVersion: ''
Width: 550
Height: 306
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
>> K.FileSize
ans =22867
-----------------------------------------------------------20180620-----------------------------------------------------
不改变像素只改变大小(一知半解)
>> imwrite(f,'C:\sf.tif','compression','none','resolution',300)
2.7.2图像与类型间的转化
>> g=mat2gray(f) 将原图像的取值范围变换为区间【0,1】
>> gb=im2bw(g,0.6) 使用阈值0.6将其转为二值图像
>> gbd=im2double(gb) 将gb转为一个值为0和1的double数值数组
若gb是uint8类数值数组,则对其使用函数im2double可以得到取值为0 0;0.0039 0.0039……
的数组,因为函数im2double会将所有的元素都除以255。 这种情况下,在保持其值为0和1的前提下要将它转换为double类数组,可以使用如下语句:>>gbd=double(gb) gbd= 0 0; 1 1
-----------------------------------------------------------20180621-------------------------------
2.8 数组索引
2.8.1向量索引
>> v=[1 3 5 7 9]
v =
1 3 5 7 9
>> v(2)
ans =
3
>> w=v.'
w =
1
3
5
7
9
>> w=v'
w =
1
3
5
7
9
>> v(1:3)
ans =
1 3 5
>> v(3:end)
ans =
5 7 9
>> v(:)
ans =
1
3
5
7
9
>> v(1:2:end)
ans =
1 5 9
>> v(1:3:end)
ans =
1 7
>> v(1:1:end)
ans =
1 3 5 7 9
>> v([1 4 5]) %一个向量做另一个向量的索引
ans =
>> v=[1 3 5 7 9]
1 7 9
例2.5 使用数组索引进行简单的图像操作
>> imshow(g)
原图a:
图a
>> fp=g(end:-1:1, :); %把图像垂直翻转 b
图b
>> fc=g(30:80, 30:80); %把图像截取一些 图c
图c
>> imshow(fp)
>> fs=g(1:5:end,1:5:end); %二次取样 如下图
>> imshow(fs)
>> plot(g(199, :)) %通过原图a中部的一条水平扫描线
-----------------------------------------------------------20180622-------------------------------
终于结束了没有意义的工作。希望每天可以多花点时间在这里。
2.10 M函数编程简介
2.10.1 M文件
2.10.2 运算符
1执行数值计算的算术运算符
2在数量上比较操作数的关系运算符
3执行函数AND、OR和NOT的逻辑运算符
1注意用. 区分矩阵乘法和数组乘法 A*B传统意义上的矩阵乘法。而A.*B则表示数组乘法,每个元素都是AB相应元素的乘积。
例2.6 算术运算符与函数max和min的示例
例2.11 使用for循环将多幅图像写入文件
g=imread('C:\t.jpeg');
for q=0:5:100
filename=sprintf('series_%3d.jpg',q);
imwrite(g,filename,'quality',q);
end
结果:
-----------------------------------------------------------20180703-------------------------------
2.10.4 代码优化
(1)向量化循环
将for循环和while循环转换为等价的向量或矩阵运算。
例 2.13 向量化的可计算优点,编写函数比较for循环和向量化代码的实现情况:
function [rt,f,g]=twodsin(A,u0,v0,M,N)
tic %Start timing
for r=1:M
u0x=u0*(r-1);
for c=1:N
v0y=v0*(c-1);
f(r,c)=A*sin(u0x+v0y);
end
end
t1=toc;
tic %Start timing
r=0:M-1;
c=0:N-1;
[C,R]=meshgrid(c,r);
g=A*sin(u0*R+v0*C);
t2=toc;
rt=t1/(t2+eps);
命令:
>> [rt,f,g]=twodsin(1,1/(4*pi),1/(4*pi),512,512);
>> rt
rt =
14.1993
>> g=mat2gray(g);
>> imshow(g)
2.10.5 交互式I/O
>> t=input('Enter your data','s')
Enter your data1,2,3
t =
1,2,3
>> class(t)
ans =
char
>> size(t)
ans =
1 5
>> n=str2num(t)
n =
1 2 3
>> size(n)
ans =
1 3
>> class(n)
ans =
double
>> A=[1 2;3 4];
>> disp(A)
1 2
3 4
>> sc='Digital Image Processing.';
>> disp(sc)
Digital Image Processing.
>> disp('QWERTYUI')
QWERTYUI