一,數字圖像處理的目的
數字圖像處理是指借助計算機強大的運算能力,運用去噪、特征提取、增強等技術對數字形式存儲的圖像進行加工、處理。數字圖像處理的目的主要有以下3點:
- 提升圖像的視覺感知質量:通過亮度、彩色等變換操作,抑制圖像中某些成分的表現力,提升圖像中特定成分的表現力,以改善圖像視覺感知效果
- 提取圖像中感興趣區域或特征:從圖像中提取感興趣區域或特征可以作為圖像分類、分割、語義標注等的依據,為計算機圖像分析提供進一步便利。按照表示方式的不同,提取的特征可以分為空間域特征和頻域特征兩大類。按照表達的圖像信息的不同,提取的特征可以分為顏色特征、邊界特征、區域特征、紋理特征、形狀特征及圖像結構特征等。
- 方便圖像的存儲和傳輸:為了減少圖像的存儲空間,降低圖像在網絡傳輸中的耗時,可首先使用各類編碼方法對圖像進行編碼,然后使用如JPEG\BMP等壓縮標准對圖像進行壓縮
二,圖像采樣和量化
一幅圖像可表示成一個范圍有限二維空間內幅值有限的函數,其數學表達為:
$I = f(x, y), x_{start}\leqslant x\leqslant x_{end},y_{start}\leqslant y\leqslant y_{end},I_{min}\leqslant I\leqslant I_{max}$
其中$x, y$表示圖像中的空間坐標,$I=f(x,y)$表示圖像某個位置的響應值,$x_{start}$和$x_{end}$表示圖像在水平方向上的邊界,$y_{start}$和$y_{end}$表示圖像在垂直方向上的邊界,$I_{min}$和$I_{max}$分別表示響應幅值的最小值和最大值。
數字圖像中像素的空間位置$x, y$以及響應值$I$均為離散值,而傳感器的輸出是連續電壓波形信號。為了產生一幅數字圖像,需要把連續的數據轉換為離散的數字化形式。圖像的數字化是將連續的模擬圖像轉換為計算機課處理的離散數字圖像的過程,該過程包括兩種操作:采樣和量化。采樣是圖像空間坐標的離散化,決定了圖像的空間分辨率。量化是圖像響應幅值的離散化,決定了圖像的灰度分辨率。采樣額量化是將模擬圖像轉換為數字圖像的兩個最重要的操作。
2.1 圖像采樣
圖像采樣是將一幅在空間上連續分布的模擬圖像分割成&M*N&的網絡,每個網格稱為一個像素,$M*N$成為圖像的空間分辨率。根據香農采樣定理,只要采樣的頻率大於被采樣信號最高頻率的2倍,就可以由采樣信號對原始信號的形態進行完整恢復。圖像采樣可以看作是對原始圖像信號的一種數字化逼近。對咖啡杯圖像進行不同頻率采樣python代碼及所得結果如圖1所示。
1 from skimage import data 2 import matplotlib.pyplot as plt 3 import numpy as np 4 5 image = data.coffee() # 導入圖像數據 6 ratios = [10, 20, 40, 80] # 設置采樣比率 7 c = 1 # 記錄子圖索引 8 9 # 遍歷采樣比率,遍歷圖像數據 10 for ratio in ratios: 11 image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32') 12 for i in range(image1.shape[0]): 13 for j in range(image1.shape[1]): 14 for k in range(image1.shape[2]): 15 delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k] 16 image1[i][j][k] = np.mean(delta) # 計算均值 17 plt.subplot(2, 2, c) 18 c += 1 19 plt.imshow(image1) 20 plt.title('ratio={}'.format(ratio)) 21 plt.show()
圖像采樣是對圖像空間位置的數字化,采樣需要確定水平和垂直方向上分割出像素的數量,該數量又稱為圖像的分辨率。一般來說,采樣間隔越大所得圖像像素數越少(上圖中ratio表示采樣間隔),空間分辨率低,圖像質量差,嚴重時出現馬賽克效應;采樣間隔越小,所得圖像像素數越多,空間分辨率高,圖像質量好,但數據量較大。
2.2 圖像量化
模擬圖像經過采樣后,在空間上實現了離散化,並形成像素。但采樣所得的像素值(即灰度值)依舊是連續量。采樣后所得的各像素的灰度值從連續量到離散量的轉換稱為圖像灰度的量化。圖像的像素值(響應值)$I(x,y)$的數字化被稱為圖像的量化,即將圖像響應值$I(x,y)$從$I_{min}$到I_{max}的實數域映射為有限級別的離散數值。圖像采樣將圖像的空間域限定為有限的離散坐標,而圖像量化則將圖像的響應值限定為有限的離散數值。與圖像量化相關的度量為灰度級。灰度級(灰度層次)是表示像素明暗程度的正數量。例如,像素的取值范圍為0~255,就稱該圖像為256個灰度級的圖像。圖像數據的實際灰度層次越多,視覺效果越好。圖2對圖像分別進行不同灰度量化的結果,對比圖像可以發現256級灰度的細節呈現能力高於其他灰度級。
圖2
python代碼如下:
1 from skimage import data 2 import matplotlib.pyplot as plt 3 import matplotlib as mpl 4 import numpy as np 5 6 mpl.rcParams['font.sans-serif'] = ['SimHei'] 7 # 量化 8 ratios = [128, 64, 32, 16, 8, 4, 2, 1] 9 c = 1 10 11 # 遍歷量化級別和圖像數據 12 for r in ratios: 13 image2 = np.zeros(image.shape) 14 for i in range(image.shape[0]): 15 for j in range(image.shape[1]): 16 for k in range(image.shape[2]): 17 image2[i][j][k] = int(int(image[i, j, k] / r) * r) 18 image2 = np.asarray(image2, dtype='int32') 19 plt.subplot(2, 4, c) 20 c += 1 21 plt.imshow(image2) 22 plt.title(u'灰度級為{}'.format(int(256 / r))) 23 plt.show()
圖像的量化比率決定了圖像的顏色精細程度。目前的一般做法是從圖像響應最大值到響應最小值進行均勻量化,划分為若干量化層級。目前常見的量化級數一般為$2^n$,如256.最小的額量化級數為2,即灰度圖像轉變為二值圖像,量化后的圖像僅有0和1兩種灰度取值。除均勻量化方法外,也存在非均勻量化。
量化等級越多,所得圖像層次越豐富,灰度分辨率高,圖像質量好,但數據量較大;量化等級越少,圖像層次欠豐富,灰度分辨率低,可能會出現假輪廓現象,圖像質量變差,但數據量較小。然而,在極少數情況下固定圖像大小,減少灰度級能改善質量,產生這種情況的可能原因是減少灰度級一般會增加圖像的對比度。例如,對細節比較豐富的圖像數字化,可能會減少圖像中用戶不感興趣的一些細節,增加感興趣區域與背景圖像的對比度。
1.3 圖像的表示和可視化
1.3.1 圖像的表示
通過采樣和量化,原本連續的圖像$I=f(x,y)$轉換為要給二維陣列$f(x,y)$,具有M行N列,其中$(x,y)$是離散坐標。一般的,直接用二維矩陣A表示量化后的圖像更方便。
二維矩陣式表示數字圖像的重要形式。一幅$M*N$的圖像可以表示為矩陣,矩陣中的每個元素稱為圖像的像素。每個像素都有它自己的空間位置和值,值是這一位置像素的顏色或者強度。
按照圖像矩陣包含元素不同,大致可以分為二值圖像,灰度圖像,彩色圖像三類:
- 二值圖像也稱單色圖像或1位圖像,即顏色深度為1的圖像。顏色深度為1表示每個像素點僅占1位,一般用0表示黑,1表示白
- 灰度圖像是包含灰度級(亮度)的圖像,每個像素由8位組成,其值的范圍為0~255,表示256種不同的灰度級。與二值圖像相比,灰度圖像可以呈現出圖像的更多細節信息
- 彩色圖像與灰度圖像類似,每個像素也會呈現256個灰度級。與灰度圖像不同的是,彩色圖像每個像素由3個8位灰度值組成,分別對應紅、綠、藍3個顏色通道
1.3.2 圖像的基本屬性
圖像的基本屬性包括:
- 圖像像素數量:在位圖圖像的水平和垂直方向上包含的像素數量。單純增加像素數量並不能提升圖像的顯示效果,圖像的顯示效果由像素數量和顯示器的分辨率共同決定
- 圖像分辨率:指圖像在單位打印長度上分布的像素的數量,主要用以表征數字圖像信息的密度,它決定了圖像的清晰程度。在單位大小面積上,圖像的分辨率越高,包含的像素點的數量越多,像素點越密集,數字圖像的清晰度也就越高
- 圖像大小:圖像大小決定了存儲圖像文件所需的存儲空間,一般以字節(B)進行衡量,計算公式為:字節數=(位圖高*位圖寬*圖像深度)/8。從計算公式可以看出,圖像文件的存儲大小與像素數目直接相關。
- 圖像顏色:圖像顏色是指數字圖像中具有最多數量的可能顏色種類,通過改變紅綠藍三原色的比例,可以非常容易地混合成任意一種顏色。
- 圖像深度:又稱為圖像的位深,是指圖像中每個像素點所占的位數。圖像的每個像素對應的數據通常可以用1位或多位字節表示,數據深度越深,所需位數越多,對應的顏色表示也就越豐富
- 圖像色調:指各種圖像顏色對應原色的明暗程度,日常所說的色調的調整也就是對原色明暗程度的調節。色調的范圍為0~255,如最簡單的灰度圖像將色調划分為從白色到黑色的256個色調。RGB圖像中則需要對紅、綠、藍三種顏色的明暗程度進行表征,如將紅色調加深圖像就趨向於深紅,綠色調加深圖像就趨向於深綠。
- 圖像飽和度:表明了圖像中顏色的純度。自然景物照片的飽和度取決於物體反射或投射的特性。在數字圖像中處理一般用純色中混入白光的比例衡量飽和度,純色中混入的白光越多,飽和度越低,反之飽和度越高。
- 圖像亮度:指數字圖像中包含色彩的明暗程度,是人眼對物體本身明暗程度的感覺,取值范圍一般為0%~100%
- 圖像對比度:指的是圖像中不同顏色的對比或者明暗程度的對比。對比度越大,顏色之間的亮度差異越大或者黑白差異越大。當對比度增加到極限時,灰度圖像就會變成黑白兩色圖像
- 圖像層次:在計算機設計系統中,為更加便捷有效的處理圖像素材,通常將它們置於不同的層中,而圖像可看作由若干層圖像疊加而成。若一個圖像有多個圖層,則每個圖層具有相同的像素、通道數及格式。
1.4 像素間的關系
- 鄰域關系:用於描述相鄰像素之間的相鄰關系,包括4鄰域,8鄰域,D鄰域等類型。其中像素位置$(x,y)$的4鄰域是$(x-1, y), (x+1, y), (x, y-1), (x, y+1)$,分別對應像素位置的上、下、左、右4個像素。一般用符號$N4(x, y)$表示像素位置$(x, y)$的4鄰域。像素的D鄰域又可以稱為像素的對角鄰域。像素位置$(x, y)$的D鄰域為$(x-1, y-1), (x-1, y+1), (x+1, y-1), (x+1, y+1)$。一般使用符號$ND(x, y)$表示位置的D鄰域。8鄰域為4鄰域和D鄰域的合集,常用$N_8(x,y)$表示。
- 連通性:是描述區域和邊界的重要概念。兩個像素聯通的必要條件是:兩個像素位置滿足相鄰關系且兩個像素的灰度值滿足特定的相似性准則。像素間的連通性可分為4連通、8連通和m連通。如果像素q在像素p的4鄰域內,則像素p和像素q是4連通的。如果像素q在像素p的8鄰域內,則像素p和像素q是8連通的。m聯通又稱為混合聯通,像素p與像素q的m聯通需要滿足以下兩個條件:像素p和像素q具有相同的像素響應值V;像素q在像素p的4鄰域內。若像素q在像素p的D鄰域內,則要求像素p和像素q的4鄰域的交集為空(沒有響應值為V的元素)。
- 像素之間的距離:對於像素$p$, $q$和$z$,坐標分別為$(x,y),(s, t)$和$(u, v)$,如果函數D滿足距離三要素,即1)非負性,$D(p, q)\geqslant 0$ 2)對稱性,$D(p, q)=0$ 3)三角不等式,$D(p, z)\leqslant D(p, q)+D(q, z)$;則稱函數D為有效距離函數或度量。常見的像素間距離度量包括: 1) 歐式距離$D_{e}=\sqrt{(x-s)^2+(y-t)^2}$,與像素p歐氏距離小於某一閾值r的像素形成一個以像素p為中心的圓。2)$D_4$距離(城市距離)$D_{e}=\left | x-s \right |+\left | y-t \right |$,與像素p的$D_4$距離小於某一閾值r的像素形成一個以像素p為中心的菱形。3)$D_8$距離(棋盤距離)$D_{8}=max(\left | x-s \right |, \left | y-t \right |)$,與像素p的$D_8$距離小於某一閾值r的像素形成一個以像素p為中心的正方形。
1.5 簡單圖像處理
數字圖像處理的本質是一個多為矩陣。數字圖像處理的本質是對多維矩陣的操作。按照處理對象的不同,可將數字圖像處理分為黑白圖像處理、灰度圖像處理、彩色圖像處理。按照處理方法進行划分,可將數字圖像處理分為空間域處理與頻域處理。按照處理策略不同,數字圖像處理又分為全局處理與局部處理。數字圖像處理一般步驟如圖3所示
圖3,數字圖像處理的一般步驟
1.5.1 圖像基本屬性的操作
數字圖像的基本屬性包括亮度、對比度、顏色通道等。這些屬性操作都可以通過矩陣操作體現。
- 亮度操作:亮度也稱為灰度,它是顏色的明暗變化范圍,常用0%~100%(由黑到白)表示。一般數字圖像的像素亮度為0~255,可以通過對像素構成矩陣的灰度值進行操作,道道調整圖像亮度的目的。圖像亮度調節可以采用最簡單的圖像處理算法,通過常見的線性運算即可完成亮度調節,如所有像素點亮度乘以或者加一個增強系數,使得圖像整體變亮或者變暗。
- 對比度操作:對比度指圖像暗和亮的落差值,即圖像最大灰度級和最小灰度級之間的差值。對於數字圖像變換,設原像素灰度為$f(i, j)$,轉化后的像素灰度為$g(i, j)$,則常用的線性變換是$g(i, j)=\alpha \times f(i, j) + \beta $,其中系數$\alpha$影響圖像的對比度,系數$\beta$影響圖像的亮度,具體如下:(1)$\alpha=1$時是原圖;(2)$\alpha > 1$時對比度增強,圖像看起來更加清晰;(3)$\alpha < 1$時對比度減弱,圖像看起來變暗;(4)$\beta$影響圖像的亮度,隨着增加$\beta(\beta > 0)$和減小$\beta(\beta > 0)$,圖像整體的灰度值上移或者下移,也就是圖像整體變亮或者變暗,不會改變圖像的對比度。針對圖像亮度、對比度改變如圖4
圖4,對比度調整
- 顏色通道操作:數字圖像的本質是一個多維矩陣,如彩色圖象是一個三維矩陣,灰度圖像和黑白圖像由二維矩陣表示。彩色圖像一般可分為紅、綠、藍3個顏色通道,每個顏色通道對應一個完整的矩陣
1.5.2 圖像的簡單運算
圖像運算是以圖像為單位對圖像進行的數學操作,是數字圖像信號處理的基礎,運算對象以像素點為基本單位,運算結果為一幅灰度分布與原圖像不同的新圖像。圖像的簡單運算包括算數運算和邏輯運算。常見的算術運算包括點運算、冪運算、直方圖運算等。
1,算術運算和邏輯運算:每次只設計一個空間像素的位置,所以可以“原地”操作。典型的運算包括圖像的加法、圖像的減法。通過算數運算實現的摳圖拼接如圖5
圖5,通過算數運算實現的圖片拼接
2,點運算:點運算只涉及一幅原圖像(稱為輸入圖像),運算對象是輸入圖像像素的灰度值,即輸出圖像每個像素的灰度值僅取決於輸入圖像中對應像素的灰度值。點運算具有兩個特點:其一,根據某種預先設置的規則,將輸入圖像各 個像素本身的灰度(和該像素孕育內其他像素的灰度無關)逐一轉換成輸出圖像對應像素的灰度值;其二,點運算不會改變像素的空間位置。因此,點運算也被稱為灰度變換。前一小節講述的亮度及對比度變換屬於點運算的范疇。點運算產生的輸出圖像的每個灰度值僅由對應的輸入像素點的值確定,因此點運算不會改變圖像內的空間關系。若輸入圖像為$A(x,y)$,輸出圖像為$B(x,y)$,則點運算表示為$B(x,y)=TA(x,y)$。
點運算又可以分為線性點運算和非線性點運算。線性點運算的原值和目標值通過線性方程完成轉換,典型的如對比度灰度調整、圖像反色都屬於線性點運算。非線性點運算對應非線性映射函數,典型的映射包括平方函數、對數函數、截取(窗口函數)、閾值函數、多值量化函數等。灰度冪次變換、灰度對數變換、閾值化處理、直方圖均衡化是較常見的非線性點運算方法。
冪次變換又稱伽馬變換,數學形式為$t = c \times s^{\gamma }$,其中$c$和$\gamma$是正常數,$s$代表原圖像像素值,$t$表示變換后的像素值。$\gamma < 1$提高灰度級,在正比函數上方,使圖像變亮。$\gamma > 1$降低灰度級,在正比函數下方,使圖像變暗。當$c=1$時,不同的$\gamma$值對應的冪次變換函數如圖6所示
圖6,不同的$\gamma$值對應的冪次變換函數
圖7, 不同gamma值情況下的冪次變換效果
3, 圖像直方圖:直方圖中的數值都是統計出來的,描述了該圖像中關於顏色的數量特征,可以反應顏色的統計分布和基本色調。直方圖只包含該圖像中某一顏色值出現的頻數,而丟失了某像素所在的空間位置信息;任一幅圖像都能唯一地給出一幅與它對應的直方圖,但不同的圖像可能有相同的顏色分布,從而就具有相同的直方圖,因此直方圖與圖像是一對多的關系;如將圖像划分為若干個子區域,所有子區域的直方圖之和等於全圖直方圖;一般情況下,由於圖像上的背景和前景物體顏色分布明顯不同,從而在直方圖上會出現雙峰特性,但背景和前景顏色較為接近的圖像不具有這個特性。顏色直方圖又可以分為三類:全局直方圖、累加直方圖、主色調直方圖。
- 全局直方圖:反應的是圖像中顏色的組成分布,即出現了哪些顏色以及各種顏色出現的概率。其對圖像的旋轉、平移、縮放和圖像質量變化不敏感,比較適用於檢索圖像的全局顏色相似性,即通過比較顏色直方圖的差異衡量兩幅圖像在顏色全局分布上的差異。
- 累加直方圖:當圖像中的特征並不能取遍所有可取值時,統計直方圖中會出現一些零值。這些零值的出現會對相似性度量的計算帶來影響,從而使得相似性度量並不能正確反映圖像之間的顏色差別。所以,在全局直方圖的基礎上使用累加顏色直方圖。在累加直方圖中,相鄰顏色在頻數上是相關的。雖然累加直方圖的存儲量和計算量有很小的增加,但是累加直方圖消除了一般直方圖中常見的零值,也克服了一般直方圖量化過細、過粗檢索效果都會下降的缺陷。
- 主色調直方圖:因一幅圖像中,往往少數幾種顏色就涵蓋了圖像的大多數像素,而且不同顏色在圖像中的出現概率是不同的,可以通過統計圖像中各種顏色出現的概率選出最頻繁出現的ji種顏色作為主色。使用主色並不會降低顏色匹配的效果,因為顏色直方圖中出現頻率很低的那些顏色往往不是圖像的主要內容,從某種程度上講,是對圖像內容表示的一種噪聲。
1.5.3 圖像卷積操作
圖像卷積操作是圖像空間域濾波的基礎運算,也是當前許多深度特征提取算法的基礎。卷積操作就是循環將圖像和卷積核逐個元素相乘再求和,結果得到卷積后圖像的過程。如圖8所示,一幅6*6的圖像使用1個3*3的卷積核進行卷積操作,結果得到一個4*4的卷積圖像。
圖8,圖像卷積操作示意
假設卷積核使用K表示,大小為m*n, 原始圖像表示為S, 大小為M*N;結果圖像表示為T,則卷積操作公式如下:
$T(x, y) = \sum_{i=-a}^{a}\sum_{j=-b}^{b}K(i, j)\times S(x+i, y+j), m=2\times a+1,n=2\times b+1$
卷積操作中,卷積核在原始圖像上做到從上到下,從左到右的滑動掃描,每次掃描使用卷積核與其掃描覆蓋區域圖像做一次卷積運算,然后再移動到下一個位置進行下一次掃描,直到掃描完畢。大部分Python圖像處理相關包均將卷積函數集成到其特征提取或濾波模塊中,並對卷積操作進行了許多優化。