目錄
2.2、MATLAB、OpenCV、Python中的圖像都是什麼
1、數字圖像的構成
簡單說,數字圖像其實就是能在計算機上顯示和操作的圖。要說圖像,其實必須得先講圖像得成像原理。大家通過中學得學習都瞭解三原色的知識:
當然,在計算機的表示中,採用的光學三原色方式存儲的。這裏就簡單的說一下,人們將不同的顏色進行細分,有點類似於AD轉換的原理,就是把模擬量按一定的精度以二進制存放到計算機裏面,以用於計算和顯示。
詳細說的話得借用朱有鵬老師的介紹:
顏色在計算機中的表示
1.1、顏色的本質
(1)顏色是主觀存在的,顏色其實是自然光在人的眼睛中和大腦中產生的一種映像。
(2)顏色的本質決定於光的波長
1.2、自然光的顏色是連續的
光的波長是連續的,導致顏色也是連續的。理論上,只要眼睛的分變能力足夠好,可以在自然界中發現無數種顏色。
根據圖像特性可以分爲兩類:位圖和矢量圖。位圖在我們常見的圖片格式中主要是BMP、JPG、GIF等,位圖表現爲像素構成的圖像,就是各種點形成的。而矢量圖則由矢量數據庫表示,最常見的就是 PNG 格式的圖。矢量圖縮放不會造成圖像的失真,入下圖[1]:
圖像類型 | 組成 | 優點 | 不足 |
位圖 | 像素 | 只要有足夠多的不同色彩的像素,就可以製作出色彩豐富的圖象,逼真地表現自然界的景象 | 縮放和旋轉容易失真,同時文件容量較大 |
矢量圖 | 矢量 | 文件容量較小,在進行放大、縮小或旋轉等操作時圖象不會失真 | 不易製作色彩變化太多的圖象 |
本系列主要採用位圖來做處理。
2、不同環境圖像的存儲方式
2.1、計算機中的顏色是離散的
(1)計算機中不可能存儲無數種顏色,所以必須將顏色有限化,所以就用有限種顏色來代表自然界種的無限種顏色。這個理論類似於AD轉換。
(2)這種離散化的缺點是不夠真實,漏掉了很多種顏色。因此計算機種所能表示的顏色不如自然界中的豐富(計算機屏幕上顯示的圖像和真實圖像有差別)。
(3)計算機所能表達的顏色種類個數,這個參數就叫像素深度。
1位:一個二進制位表示顏色,這種就叫單色顯示。實例就是小飯店、理髮店門口的LED屏。
8位:用8個二進制位來表示顏色,此時能表示256中顏色。這種叫灰度顯示。這時候是黑白的,沒有彩色。我們把純白到純黑分別對應表示255-0。中間的數對應不同的灰。實例就是以前的黑白電視機。
16位:用16個二進制位表示顏色,此時能表示65536種顏色。這時候就可以彩色顯示了。一般採用RGB565的顏色分佈(5位二進制表示紅色、6位二進制表示綠色、5位二進制表示藍色)。這種紅綠藍都有的顏色表示法就是一種模擬自然界中所有顏色的表示方式。但是因爲RGB的顏色表達本身二進制位數不夠多(導致紅綠藍三種顏色本身分的都不夠細緻),所以這樣顯示的彩色失真比較嚴重,所以人眼能明顯看出顯示的不真實。
補充:顏色的組成,三原色RGB。
24位:用24個二進制位表示顏色,能夠表示16777216。這種表示方法和16位表示原理一樣,只是RGB三種顏色各自的精度都更高了,RGB888。比RGB565更加真實細膩,雖然說比自然界無數種顏色還是少了很多,不過由於人眼的不理想性,人眼是感受不到這種差別,於是把RGB888的表示方法稱爲真彩色;RGB565位僞彩色。
32位:總共用32位二進制表示顏色,其中24位表示紅綠藍三原色,仍爲RGB888,剩下的8位表示透明度。這種顯色方式就叫ARGB(A爲alpha,表示透明度),現在的PC中一般都是ARGB表示顏色。
2.2、MATLAB、OpenCV、Python中的圖像都是什麼
在考試的時候可能會遇到這樣的問題:"opencv裏面RGB圖像的存儲方式是什麼?"
(1)、MATLAB 是一個強大的數學計算軟件,MATLAB 中的圖像是作爲三維矩陣來存放的。
上面的黑線不知道哪裏來的,原圖是直接從百度扣下來的!!
MATLAB直接作爲矩陣操作即可。
顏色 | R | G | B |
紅色(0xFF0000) | 255 | 0 | 0 |
綠色(0x00FF00) | 0 | 255 | 0 |
藍色(0x0000FF) | 0 | 0 | 255 |
(2)OpenCV 是一個開源的圖像處理函數庫,主要由C++寫成。
圖像在OpenCV中的存放方式與MATLAB不同,大家可以參考[2]。
顏色 | R | G | B |
紅色(0x0000FF) | 255 | 0 | 0 |
綠色(0xFF0000) | 0 | 255 | 0 |
藍色(0xFF0000) | 0 | 0 | 255 |
在OpenCV中,紅色存儲在低位,藍色存儲在高位上。
(3)Python 不使用OpennCV的情況下
Python是一種跨平臺的計算機程序設計語言[3]。,可以通過各種各樣的模塊來進行各種開發項目。本系列主要針對 PIL 模塊進行圖像處理的研究。
圖像在Python中的存放方式與MATLAB中相同,也是採用了類似於矩陣的形式。Python中用於圖像處理的庫主要有PIL和matplotlib,並且常常結合numpy來使用。其中matplotlib受到matlab的啓發,是繪製各類可視化圖形的重要工具。
理解圖像的存儲方式對於後續的計算和使用十分重要!!!!!
3、圖像中的信息
通過視覺,人和動物感知外界物體的大小、明暗、顏色、動靜,獲得對機體生存具有重要意義的各種信息,至少有80%以上的外界信息經視覺獲得,視覺是人和動物最重要的感覺[4]。
在數字圖像處理中,圖像含有很多有用的信息,提取出來這些信息是圖像處理的主要工作。這些信息有輪廓、顏色等。
4、數字圖像處理的基本步驟
數字圖像處理的步驟主要有以下[5]:
(1)圖像的點運算:如圖像的拉伸、對比度增強、直方圖均衡和直方圖匹配等;
(2)圖像的幾何變換:主要應用於圖像的幾何歸一化;
(3)圖像的增強;
(4)小波變換;
(5)圖像復原;
(6)彩色圖像處理;
(7)圖像分割;
(8)特徵提取;
(9)對象識別。
5、預備知識
5.1、鄰接性、連通性、區域和邊界
5.1.1 鄰接性
鄰接性主要用於確定像素之間的相似程度,主要有3種鄰接關係[5],如圖:
相似性其實是有主觀標準的。另外,鄰域的定義是有數學形式的。
首先定義一個概念,就是 爲對角鄰域,即第三幅圖所示的位置;另外,定義V用於決定鄰接性的灰度值集合,用於確定像素之間的相似度,假設我們認爲只有灰度值爲1的像素是相似的,則V = {1},假如我們認爲 灰度爲0,1,2的像素是相似的,那麼V = {0,1,2}。即 V 是相似灰度值(或彩色值)相似的值的集合。
4-鄰接:設一個像素 Q滿足 Q 在 P 的四鄰域內,即 ,則稱V中兩個數值的像素 P,Q 是 4 鄰接的。
理解:這裏要求的四鄰接有2個條件,首先,像素 Q滿足 Q 在 P 的四鄰域內;其次像素P和Q的灰度值要在V中,這樣才能稱爲 4 鄰域。
同樣,8-鄰域也是這樣定義的。
5.1.2、連通性
連通性的定義與鄰接性相關,首先定義一個通路(Path)的概念。
通路:是指兩個不同位置的像素P(x0,y0),Q(xm,yn),從一個像素出發,存在至少一個特定的像素序列 (xi,yj) i=0,1,...m,j=0,1,....,n。使對所有的 與 ,1<=i,j<=m,n是鄰接的。則這個像素序列就稱爲通路。
連通性:令S代表一幅圖像的像素子集。如果在S中全部像素之間存在一個通路,則可以稱2個像素P,Q在S中是連通的。此外,對於S中任何像素P,S中連通到該像素的像素集叫做S的連通分量,如果S中僅有一個連通分量,則集合S叫做連通集。
上圖中,陰影部分爲圖像子集S,而 V={1}。則紅線表示連通分量。
5.1.3、區域和邊界
區域的概念是建立在連通集上的,令R是圖像中的一個像素子集,如果R同時是連通集,則稱R爲一個區域。
邊界是相對於區域而言的,一個區域的邊界是區域中所有有一個或多個不在區域R上的鄰接像素或像素的集合。
5.1.4、度量圖像的距離
假設對於像素 P(xp,yp)、像素Q(xq,yq)、R(xr,yr)滿足如下三個條件,有函數D,則D爲距離。
(1)D(P,Q) >= 0,當且僅當P=Q時,D(P,Q)==0;
(2)D(P,Q) = D(Q,P);
(3)D(P,Q)<= D(P,R)+D(R,Q);
常見的距離函數:
(1)歐式距離:
其實就是兩點之間的距離公式,表示直線距離;距離等於 r 的像素形成以P爲圓心的圓。
(2)D4距離(街區距離)
我覺得這個看名字就知道了,也就是通過四鄰域形成的距離。
(3)D8距離,同(2),由8鄰域形成的
5.2、圖像的基本操作
5.2.1、點運算和鄰域運算
點運算是指對圖像中的每一個像素都進行灰度變換。
5.2.2、線性和非線性操作
線性變換通常由線性算子給出,例如平均平滑濾波、高斯平滑濾波、梯度銳化等。
參考:
【1】圖片來源 https://zhidao.baidu.com/question/109059224.html
【2】https://my.oschina.net/u/3919756/blog/1936776
【3】https://baike.baidu.com/item/Python/407313?fr=aladdin
【4】https://baike.baidu.com/item/%E8%A7%86%E8%A7%89/5228?fr=aladdin
【5】佚名. 精通Matlab數字圖像處理與識別[M]. 2013.