1. 程式人生 > >1-2、數字影象處理基礎

1-2、數字影象處理基礎

數學建模題目中有時會涉及到與數字影象有關的操作。在這類題目中,往往不會涉及到太多與數字影象處理相關的專業知識,但是要求程式設計師瞭解影象儲存格式與常用基礎操作等。

一、數字影象常用儲存格式。

數字影象在計算機中以矩陣形式儲存,通過一個或多個數字表示每個點的數值大小來控制每個畫素點的顏色變化。常見的儲存型別有灰度影象、RGB影象、二值影象、HSI影象等等。在這裡我們著重介紹灰度影象與RGB影象。

灰度影象,顧名思義,是一種單色影象,只有純白、純黑、和254個不同深度大小的介於純白、純黑之間的灰色強度。對於灰度圖,每個畫素的亮度由且僅由一個數值來表示,通常數值範圍在0到255之間,0表示黑、255表示白,其它值表示處於黑白之間的灰度,數字越小就越白。由於灰度圖的儲存方式易於理解,比較簡單且涵蓋了較多的影象資訊,在不需要彩色資訊時我們常將影象轉化為灰度影象進行進一步操作。

灰度影象

二值影象,可以作為一種特殊的灰度影象來理解。他只有純黑和純白兩種顏色,在計算機中每個畫素點只有0、1兩種取值可能。其中0表示黑色,1表示白色。

二值影象

在中學學習美術時,我們都知道紅、黃、藍是三原色。通過這三個顏色的顏料畫在一起疊加即可組合成任意一種顏色。在計算機裡,也類似,但三原色不再是紅、黃、藍,而是紅(R)、綠(G)、藍(B)。在計算機裡通過控制這三個顏色的量組合在一起,也可以合成任意一種顏色,於是就有了RGB圖。RGB影象裡,每個畫素點由三個數值控制顏色,分別對應紅、綠、藍的分量大小。範圍一般也為0~255之間,0表示這個顏色分量沒有,255表示這個顏色分量取到最大值。例如:某RGB圖中一個畫素點的紅、綠、藍分量均為255,則根據光學疊加的理論可知,該點為純白色。

RGB影象

HIS影象每個畫素點由色調、飽和度、亮度決定。相比較之下,在數學建模類題目裡並不常用。

相關例項與程式碼:

(1)假設matlab中有一張RGB影象存放於變數pic中,將其轉化灰度影象。

newPic= rgb2gray('pic')

注:rgb2gray函式中的2,按照英文讀作two,與to同音。這個函式讀為rgb to gray,同理,其他影象儲存型別轉化函式也類似此函式。

(2)生成一幅128*128的RGB影象,該影象左上角為紅色、右上角為藍色、左下角為綠色,右下角為白色。

程式碼:

clear;clc;
picRed=zeros(128,128);      %初始化RGB紅色分量為0矩陣
picRed(1:64,1:64)=1; picRed(65:128,65:128)=1; %令左上角、右下角的紅色分量值為1 picGreen=zeros(128,128); %初始化RGB綠色分量為0矩陣 picGreen(65:128,1:64)=1; picGreen(65:128,65:128)=1; %令左上角、右下角的綠色分量值為1 picBlue=zeros(128,128); %初始化RGB藍色分量為0矩陣 picBlue(1:64,65:128)=1; picBlue(65:128,65:128)=1; %令左上角、右下角的藍色分量值為1 pic=cat(3,picRed,picGreen,picBlue); %合成RGB分量 imshow(pic);title('生成影象'); %顯示影象

結果:

分析:
RGB影象存在紅,綠,藍三個顏色的通道。每個畫素點由這三個通道的強度合成決定顏色。根據光學理論,當紅色分量為255,其他分量為0時,呈現出紅色;當綠色分量為255,其他分量為0時,呈現出綠色;當藍色分量為255,其他分量為0時,呈現出藍色。當三通道的顏色分量全為255時,顯示出的顏色變為白色。同理,當三通道分量全為0時會顯示黑色。

二、數字影象的讀取與顯示。

(1)影象讀取——imread

Matlab自帶參考文件裡imread的用法介紹:

imread - Read image from graphics file

    This MATLAB function reads a grayscale or color image from the file specified by
    the string filename.

    A = imread(filename, fmt)
    [X, map] = imread(...)
    [...] = imread(filename)
    [...] = imread(URL,...)
    [...] = imread(...,Param1,Val1,Param2,Val2...)

以其中一個常用的用法為例:

[...] = imread(filename)

其中filename為待讀取影象檔名。若該影象不在matlab預設路徑下並不與當前執行.m檔案同目錄時,需要手動新增路徑名。

例項:

>> pic=imread('E:\1.jpg')

該程式碼將E盤下的1.jpg檔案讀入了matlab,用變數pic儲存。

(2)影象顯示——imshow

Matlab自帶參考文件裡imshow的用法介紹:

imshow - Display image

    This MATLAB function displays the image I in a Handle Graphics figure, where I
    is a grayscale, RGB (truecolor), or binary image.

    imshow(I)
    imshow(I,RI)
    imshow(X,map)
    imshow(X,RX,map)
    imshow(filename)
    imshow(___,Name,Value...)
    imshow(gpuarrayIM,___)
    imshow(I,[low high])
himage = imshow(___)

以其中一個常用的用法舉例:

imshow(I)

其中,I為一個矩陣。該函式將把該矩陣所代表的影象顯示出來。

注:並不是只有讀取的圖片所生成的變數才可以顯示出影象,一般而言自己建立的、符合要求的矩陣均可通過該函式顯示出其代表的影象。

(3)批量獲取影象

在做題的時候,有時會需要讀取一個資料夾裡的所有影象。輸入幾十行imread的確是一種方法,不過非常低階。此時應使用批量讀取影象的方法。

首先需學習dir函式,可以通過它獲取當前資料夾下的檔名等資訊。在此列出其幾個常用用法:

    filepath=dir('.')       %列出當前目錄下所有子資料夾和檔案
    filepath=dir('E:\matlab')   %列出指定目錄下所有子資料夾和檔案
    filepath=dir('*.m') %列出當前目錄下符合正則表示式的資料夾和檔案

變數filepath用於存放dir函式返回的檔案資訊。filepath變數不再是一個單純的數值矩陣,而是一個面向物件的物件矩陣。每個物件包含name、date、bytes等屬性。可通過filepath.name呼叫檔名。

有關正則表示式的知識在此不詳細敘述,上述dir函式第三個用法中的正則表示式*.m表示所有檔名以.m結尾的檔案。

以本校2017年新銳賽題目為例,將資料夾中20個影象統一格式、分別命名為1.jpeg~20.jpeg後,可用如下程式碼讀取:

for i=1:20
        imageName=strcat('附件1:英文縱切\',num2str(i-1),'.jpeg');
        pic(:,:,i)=rgb2gray(imread(imageName));
end

此程式碼讀取了資料夾中的20個數字影象檔案並將其轉化成了灰度影象儲存於三維變數pic中。最高維數字代表第幾張圖。

若不事先手動統一名稱,可用如下程式碼讀取:

filepath=dir(‘*.jpeg’); 
for i=1:size(filepath)      
  filename=strcat('附件1:英文縱切\’,filepath(i).name);     
    pic(:,:,i)=rgb2gray(imread(filename));
end

三、數字影象基礎操作。

(1)水平映象

程式碼:

I=imread('1.jpg');      % 讀取影象1.jpg
subplot(1,2,1);         % 畫1行2列的子圖的第一部分
imshow(I);                  % 顯示影象
title('原圖');            % 新增標題“原圖”
I=double(I);                % 將I影象中灰度值轉化為double型別
H=size(I);                  % 將I影象大小賦值給H
I2(1:H(1,1),1:H(1,2))=I(1:H(1,1),H(1,2):-1:1);  % 行座標不變,列座標反轉
subplot(1,2,2);         % 畫1行2列的子圖的第二部分
imshow(uint8(I2));      % 顯示影象
title('水平映象');      % 新增標題“水平映象”

結果:

(2)大小變換——imresize

newPic=imresize(pic,[200,200])

此程式碼將存放於matlab中的影象變數轉化成了200*200大小畫素點的新影象,並存放於變數newPic中。

(3)旋轉——imrotate

B=imrotate(A,angle,method,’loose’);
   B=imrotate(A,angle,method,’crop’);
   解釋:angle為旋轉的角度(預設逆時針旋轉)
         method為插值方式
         loose:當圖片旋轉一定角度之後,若使得圖片超出範圍大小,不剪掉超出部分
         crop:當圖片旋轉一定角度之後,若使得圖片超出範圍大小,剪掉超出部分

舉例:

clear;
pic=imread('1.jpg');
pic_new1=imrotate(pic,45,'nearest','crop');
pic_new2=imrotate(pic,45,'nearest','loose'); 
subplot(1,3,1);                            
imshow(pic);
title('原圖');
subplot(1,3,2);
imshow(pic_new1);   
title('crop');
subplot(1,3,3);
imshow(pic_new2);
title('loose');        

執行結果:

這裡寫圖片描述

除此之外,數字影象還有多種濾波、頻域變換、角點檢測等知識,設計數字影象處理專業課知識且在數學建模中用的不多,在此不介紹。