數字圖像處理

最近開始學習數字圖像處理,使用matlab實現,下面我就來記錄筆記和體會,一方面是給大家提供參考,另一方面是防止我忘記了。

複習一下:

1.數字圖像是用一個數字矩陣來表示的,數字陣列中的每個數字,表示數字圖像的一個最小單位,稱爲像素。

2.數字圖像處理可以理解爲兩個方面的操作:一個是圖像到圖像的處理(如圖像的灰度轉換,圖像增強等),另外一個是圖像到非圖像的一種表示,比如圖像的測量。

3.數字圖像處理的研究內容有很多個方向,比如:

  ·圖像數字化:將一幅圖像以數字的形式表示,主要包括採樣和量化兩個過程。

  ·圖像增強:將一幅圖像中的有用信息進行增強,同時對無用的信息進行抑制,提高圖像的可觀察性。

  ·圖像的幾何變化:改變圖像的大小、形狀等。

  ·圖像的變換:通過數學的方法,將空間域的圖像信息  轉換  到 頻域、時頻域等空間進行分析。

  ·圖像識別與理解:通過對圖像中各種不同的物體特徵進行量化描述後,將其所期望獲得的目標物進行提取,並且對所提取的目標物進行一定的定量分析。

4.位圖可以使用二維的矩陣進行表示,不同的格式圖像,存儲格式不一樣,主要有:

      ·二值圖像:圖像像素使用二維矩陣表示,矩陣的值就是像素的顏色值,值只有兩個值0和1(或者0和某個不爲0的值,比如0和255),只能表示兩種顏色:黑和白,一般值越大越趨於白;

  ·8位索引圖像:圖像像素使用二維矩陣表示,但是矩陣的值不是像素的顏色值,矩陣的值表示索引表的序號;也就是說,8位索引圖像需要一個矩陣和一張索引表來表示,索引表有256個序號,每個序號對應一組RGB值,表示了一種顏色,因此8位索引圖像的一個像素有256中顏色變化。

  8位索引圖像有彩色圖像和灰度圖像之分,灰度圖像的RGB值相等且都等於序號的值;而彩色圖像的RBG不相等。

  ·24位真彩圖:也是用矩陣表示,圖像像素直接用RGB顏色顯示,而不是通過顏色索引表。圖像的像素用三個變量表示即(R,G,B),每個變量從0~255變化,因此一個像素也就是8bit*3=24bit,一個像素用24bit表示可以有2^24種顏色。

 

  今天主要學的是:

    ·RGB圖像轉爲灰度圖像

    ·有顏色的索引表位圖轉換成灰度圖

    ·RGB圖像轉爲索引圖像

    ·灰度圖像轉爲索引圖像

    ·灰度圖像轉爲二值圖像

    ·RGB圖像轉爲二值圖像

 

1、RGB圖像轉爲灰度圖像

  這裏的RGB圖像爲任何一張彩色圖,然後經過轉換之後,得到一張灰度圖像,使用matlab實現如下所示:

複製代碼
close all ;%關閉所有文件
clear all ;%清除所有變量
clc ;      %清屏
X=imread('Hydrangeas.jpg');%讀入RGB圖像
I=rgb2gray(X);%進行灰度變化
set(0,'defaultFigurePosition',[100,100,1000,500]);%設置顯示圖像的窗口大小
set(0,'defaultFigureColor',[0 0 0]);%設置顯示的背景顏色
subplot(121),imshow(X);%顯示讀入的圖像
subplot(122),imshow(I);%顯示進行灰度變化後的圖像
複製代碼

   運行一下,如下圖所示:

得到如下結果:

 

下面說一下代碼中需要注意的事項:
    ·imread是讀入圖像的函數,讀入的圖像需要放到當前的工作目錄下,或者直接輸入路徑:X=imread('F:/圖像處理/Hydrangeas.jpg');
    ·rgb2gray是將彩色圖像轉換成灰度圖像的函數
    ·運行之後,可以查看X和I的變量:

                 

X是三維的,而I是二維的,這是需要注意的。

     ·然後:set(0,'defaultFigurePosition',[100,100,1000,500]);中:

[100,100,1000,500]:前面的兩個參數100,1000主要是用來設置窗口的相對位置,後面的兩個參數1000,500主要設置窗口大小,1000是設置窗口的橫向長度,500是設置窗口的高度。
    set(0,'defaultFigureColor',[0 0 0]);中:
[0 0 0]表示設置背景顏色爲黑色。[1 0 0]表示設置背景顏色爲紅色,等等。

    ·imshow是顯示圖像的函數。
subplot(121)是窗口顯示圖像的方式,設置爲在同一個窗口顯示,一行兩列。然後subplot(121),imshow(X)則是:X顯示第一幅圖像在第一行第二列的第一個位置。
subplot(122),imshow(I)則是:I顯示第一幅圖像在第一行第二列的第二個位置。效果如上面所示。


2.有顏色的索引表位圖轉換成灰度圖
  但是這裏輸入的8bit的帶索引表的彩色圖像,然後將它轉換成灰度圖。代碼如下所示:
複製代碼
close all ;
clear all ;
clc ;
[X,map] = imread('Hydrangeas.bmp');%讀入圖片
newmap = rgb2gray(map);%將彩色的索引錶轉換成灰色的索引表
figure, imshow(X,map);%顯示原始的圖片
figure, imshow(X,newmap);%顯示轉換後的圖片
複製代碼
  圖片如下所示:

下面說一下需要注意的地方:
  從上圖中我們看到,X是一個二維的變量,此外map、newmap也是一個二維的變量;變量的含義是不一樣的,X變量表示的是這是一張768x1024像素大小的圖片。
而map和newmap則表示的顏色索引表的內容,總共256行,每行3列(即RGB)。
  這裏用figure進行顯示圖像。


3.RGB圖像轉爲索引圖像
  這裏將一幅RGB圖(彩色圖,比如說jpg、真彩色等彩色圖)轉換成索引圖,也就是帶索引表的圖像。這裏轉換成索引的彩色圖像,與第1.不同,代碼如下:
複製代碼
close all ;
clear all ;
clc ;
RGB=imread('F:/圖像處理/Hydrangeas.jpg');
[X1,map1]=rgb2ind(RGB,64);
[X2,map2]=rgb2ind(RGB,0.2);
map3 = colorcube(128);
X3 = rgb2ind(RGB,map3);
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[0 1 1]);
figure;
subplot(131),imshow(X1,map1),title('最小方差轉換');
subplot(132),imshow(X2,map2),title('均勻量化發轉換');
subplot(133),imshow(X3,map3),title('顏色近似法轉換');
複製代碼

 

下面解釋一下代碼:
    RGB=imread('F:/圖像處理/Hydrangeas.jpg');
  這是讀入圖像了,跟前面的兩種轉換方式的意思一樣,讀入的是一幅彩色圖像。
    [X1,map1]=rgb2ind(RGB,64);
    [X2,map2]=rgb2ind(RGB,0.2);
  這兩行代碼都用到了rgb2ind這個函數,我們來看一下這個函數的意思:

由此,我們可以知道,
  [X1,map1]=rgb2ind(RGB,64);就是使用最小方差量化將RGB圖像轉換爲索引圖像X. MAP最多包含N種顏色。 N必須<= 65536。
  [X,MAP] = rgb2ind(RGB,TOL)使用均勻量化將RGB圖像轉換爲索引圖像X. MAP最多包含(FLOOR(1 / TOL)+1)^ 3種顏色。 TOL必須介於0.0和1.0之間。、
這裏FLOOR=1,當TOL等於0.2時,則表示216種顏色。

    map3 = colorcube(128);
    X3 = rgb2ind(RGB,map3);

  上面的兩行代碼則是創建一個指定顏色數目的所以表,然後用這個索引表進行近似顯示RGB圖。colorcube增強的彩色立方體顏色圖。 colorcube(M)返回一個包含彩色立方體的M-by-3矩陣。 colorcube本身的長度與當前的色彩映射相同。 彩色立方體在RGB色彩空間中包含儘可能多的定期間隔的顏色,同時嘗試提供更多的灰色,純紅,純綠和純藍色的步驟。 該多維數據集的算法靈感來自默認的Macintosh系統colortable,對於M = 256,colorcube返回完全相同的顏色。 對於M <8,返回長度爲M的灰色斜坡。
後面的代碼則是顯示了,不再多說。
下面的顯示效果:
    

 

4.灰度圖像轉爲索引圖像

  我們先將彩色圖像轉換成灰度圖像,然後再講灰度圖像轉換成8種顏色的索引表(也就是索引表長度爲8),代碼如下所示:

複製代碼
close all ;
clear all ;
clc ;
RGB=imread('F:/圖像處理/Hydrangeas.jpg');
gray=rgb2gray(RGB);%得到灰度圖
[X,map] = gray2ind(gray,8);%將灰度圖轉成索引圖,8種顏色
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[0 0 0]);
figure;
subplot(121), imshow(gray);%顯示灰度的圖片
subplot(122), imshow(X,map);%顯示轉換後的圖片
複製代碼

 

  這裏需要說明的是用到了gray2ind函數,這個就是將灰度圖像轉換成索引圖像的函數,功能如下所示:

  我們這裏取N=8,索引表長度爲8。運行效果如下所示:

 

 

 

 

5.灰度圖像轉爲二值圖像

  我們也是先將RGB圖轉成灰度圖,然後在將灰度圖轉爲二值圖像,代碼如下所示:

 

複製代碼
close all ;
clear all ;
clc ;
RGB=imread('F:/圖像處理/Hydrangeas.jpg');
gray=rgb2gray(RGB);%得到灰度圖
BW1 = im2bw(gray,0.3);%將灰度圖轉成二值圖,閾值爲0.4
BW2 = im2bw(gray,0.7);%將灰度圖轉成二值圖,閾值爲0.7
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[1 1 1]);
figure;
subplot(131), imshow(gray);%顯示灰度的圖片
subplot(132), imshow(BW1);%顯示轉換後的圖片
subplot(133), imshow(BW2);%顯示轉換後的圖片
複製代碼

這裏需要說明的是,灰度轉二值圖的函數是im2bw,後面的閾值的意思是,判斷哪些該轉換成1,哪些該轉換成0,閾值設置得越小,得到的二值圖像的白色面積越多。代碼運行的效果如下所示:

 

 

 

6.RGB圖轉爲二值化圖像

讀進RGB圖之後,直接轉爲二值圖像,代碼如下所示:

 

複製代碼
close all ;
clear all ;
clc ;
RGB=imread('F:/圖像處理/Hydrangeas.jpg');
BW1 = im2bw(RGB,0.3);%將灰度圖轉成二值圖,閾值爲0.4
BW2 = im2bw(RGB,0.7);%將灰度圖轉成二值圖,閾值爲0.7
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor',[1 1 1]);
figure;
subplot(131), imshow(RGB);%顯示灰度的圖片
subplot(132), imshow(BW1);%顯示轉換後的圖片
subplot(133), imshow(BW2);%顯示轉換後的圖片
複製代碼

 

 

運行效果如下所示:


發佈了46 篇原創文章 · 獲贊 88 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章