1. 程式人生 > >數字影象處理Matlab程式碼【1基本原理】

數字影象處理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