最近開始學習數字圖像處理,使用matlab實現,下面我就來記錄筆記和體會,一方面是給你們提供參考,另外一方面是防止我忘記了。算法
複習一下:函數
1.數字圖像是用一個數字矩陣來表示的,數字陣列中的每一個數字,表示數字圖像的一個最小單位,稱爲像素。學習
2.數字圖像處理能夠理解爲兩個方面的操做:一個是圖像到圖像的處理(如圖像的灰度轉換,圖像加強等),另一個是圖像到非圖像的一種表示,好比圖像的測量。spa
3.數字圖像處理的研究內容有不少個方向,好比:code
·圖像數字化:將一幅圖像以數字的形式表示,主要包括採樣和量化兩個過程。blog
·圖像加強:將一幅圖像中的有用信息進行加強,同時對無用的信息進行抑制,提升圖像的可觀察性。索引
·圖像的幾何變化:改變圖像的大小、形狀等。圖片
·圖像的變換:經過數學的方法,將空間域的圖像信息 轉換 到 頻域、時頻域等空間進行分析。ci
·圖像識別與理解:經過對圖像中各類不一樣的物體特徵進行量化描述後,將其所指望得到的目標物進行提取,而且對所提取的目標物進行必定的定量分析。數學
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圖像轉爲二值圖像
一、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);%顯示轉換後的圖片
運行效果以下所示: