数字图像处理Matlab代码【1基本原理】

今天开始学习冈萨雷斯的《数字图像处理》。本文主要记录书中的例题,以便今后学习参考。

-----------------------------------------------------------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(fc)
>> 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

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值