CV02 — Python圖像Images過濾處理

Iris
11 min readSep 19, 2021

--

為何有此技術 ?

  • 運用在圖像預處理階段 Images Preprocessing
  • 檢測邊緣(Edges)和輪廓(Contours)時,噪聲(Noise)會對檢測的準確性(Accuracy of Detection)產生很大影響,因此需去除噪聲和控制像素值的強度
  • 幫助模型專注一般細節,以有更高的accuracy

方式

模糊 Blurring

1. 平均模糊 Averaging Blurring :

也稱Normalized Box Filter,選擇一個總pixel數為奇數,K x K大小的方形window,"從左至右、由上而下"的走過整張圖片,每個此window所在的最中央的那個點,把它調整為window內所有其它點的平均值

cv2.blur(src, ksize, anchor)

  • src:輸入的圖像
  • ksize:平均卷積核的尺寸
  • anchor:核的基準點,默認值點(- 1,1)表示 anchor 位於內核中心。

2. 高斯模糊 Gaussian Blurring :

與Averaging Filter類似,差別只在於中間那個點的計算方式不同,作法是給予各點不同的權值,愈靠近中央點的權值愈高,最後再以平均方式計算出中央點

cv2.GuassianBlur(src, ksize, sigmaX, sigmaY)

  • src:輸入的圖像
  • ksize:高斯核尺寸,必須是奇數
  • sigmaX:沿 X方向的標準差
  • sigmaY:沿 Y方向的標準差。如果我們只指定了 X 方向的的標準差,Y 方向也會取相同值。如果兩個標準差都是0,那麼函數會根據核函數的大小自己計算得出標準差。

3. 中值模糊 Median Blurring :

Median Filter的原理與前述的兩種作法相似,也是給予一個 K x K 大小的方形window,但是Median是找出所有點(最中央那個點除外)的中間值,因此所使用的那個點是個" 已經存在" 的像素而非計算出來的像素,這也是它可以被應用在除噪功能上的原因。

cv2.medianBlur(src, ksize)

4. 雙邊濾波 Bilateral Filtering :

採用了兩個高斯濾波的結合,一個負責計算 "空間鄰近度" 的權值,也就是常用的高斯濾波器原理,而另一個負責計算 "像素值相似度" 的權值。可以在消除噪聲的
同時保持邊緣清晰,需要 sigmaSpace 和 sigmaColor 參數。

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, )

d:用於濾波的每個像素鄰域的直徑. 如果這個值是負數,則根據sigmaSpace自動計算
sigmaColor:
顏色空間的標準差,愈大代表在計算時需要考慮更多的顏色。
sigmaSpace:坐標空間中濾波器的 sigma值,參數值越大,表示距離越遠的像素只要顏色足夠接近就會相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色
.

以上技術都有一個共同的基本原理 :

>> 即使用濾波器(內核)Filter (Kernel)
>> 將捲積運算 Convolutional Operations 應用於圖像

閾值 Thresholding

為了減少圖片維度,會將一張彩色圖片轉為灰階後,再轉為黑白來處理,此時在相片上任何一點的值,它的值將不是0就是255。為了決定該點為黑(0)或白(255),必須設定一個Threshold值,告訴電腦若超過了此值,就要將該點設為255,否則為0,電腦再依據此值完成圖片上所有點的比較之後,整張圖片就會被轉換為一張黑白圖片,這樣的處理過程就是Thresholding

(e.g. thresh = 127 ,maxval = 255)

  • THRESH_BINARY

cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

  • THRESH_BINARY_INV

cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

  • THRESH_TRUNC

cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)

  • THRESH_TOZERO

cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)

  • THRESH_TOZERO_INV

cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

自適應閾值 Adaptive Threshold

不是計算全局圖像的閾值,而是根據圖像不同區域 ”亮度分佈”,計算其局部閾值,所以對於圖像不同區域,能夠自適應計算不同的閾值

cv2.adaptiveThreshold(Input src, 255, adaptiveMethod, thresholdType, blockSize, C)

  • Input src:源圖像
  • adaptiveMethod:在一個鄰域內計算閾值所採用的算法,有兩個取值,分別爲 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。 (ADAPTIVE_THRESH_MEAN_C的計算方法是計算出領域的平均值再減去參數 C的值。 ADAPTIVE_THRESH_GAUSSIAN_C的計算方法是計算出領域的高斯均值再減去參數 C的值。)
  • thresholdType:這是 ”閾值類型 ”,只有兩個取值,分別爲 THRESH_BINARY 和THRESH_BINARY_INV
  • blockSize:adaptiveThreshold的計算單位是像素的鄰域塊,這是局部鄰域大小,3、5、7等。
  • C:偏移值調整量,用均值和高斯計算閾值後,再減或加這個值就是最終閾值。

漸變過濾 Gradient filtering

  1. Sobel : vertical(sobel_x )、horizontal(sobel_y)
  2. blended : sobel_x 和sobel_y 的結合
  3. Laplacian : 使用 x 和 y 的 二階導數,與Gradient 過濾器不同之處在於該過濾器會先做平滑化處理以去除雜訊,接著才使用過濾器來強化邊緣。

形態轉換 Morphological Transformation

運作 :

1. 腐蝕 Erosion :

侵蝕前景物體的邊界(總是試圖保持前景為白色)。內核在圖像中滑動(如在2D卷積中),只有當內核下的所有像素都是1時,原始圖像中的像素(1或0)才會被視為1,否則它將被侵蝕(變為零)

cv2.erode(img, kernel, iterations = 1)

[補充] 第一個參數為二值化的影像, 第二個參數為使用的捲積 kernel,第三個參數為迭代次數(預設為1)

2. 膨脹 Dilation :

恰好與腐蝕相反,如果內核下至少一個像素為“1”,則像素元素為“1”,它增加了圖像中的白色區域或前景對象的大小增加。

cv2.dilate(img, kernel, iterations = 1)

3. 開運算 Opening :

開運算是先腐蝕再膨脹的另一種說法,它有助於消除噪音

cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

4. 閉運算 Closing :

開運算與閉運算,腐蝕和膨脹是相反的。閉運算就是先膨脹再腐蝕,它可用於關閉前景對象內的小孔或對象上的小黑點。

cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

5. 梯度運算 Morphological Gradient :

膨脹 — 腐蝕,先對圖像做膨脹操作,再做腐蝕操作,然後膨脹減去腐蝕即可得到梯度運算。可以突出團塊(blob)的邊緣,保留物體的邊緣輪廓。

cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

6. 頂帽 Top Hat :

頂帽運算 = 原始圖像 — 開運算

原始輸入 — 開運算結果,然後得到的是圖像的噪聲

cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

7. 黑帽 Black Hat :

閉運算 — 原始輸入,得到圖像內部的小孔,或者前景色中的小黑點

cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

▶Edge Detection

Sobel Detection

Sobel濾波器使用空間一階導數來 增強高頻的空間訊號,在影像中, 這些高頻訊號通常代表較銳利的 物體邊緣或線條特徵。

一維的一階導數: Gx , Gy

二維的一階導數以梯度(gradient) 表示: = Gx + Gy

cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])

  • src:輸入圖像
  • ddepth: 輸出圖像的深度(可以理解為數據類型),-1表示與原圖像相同的深度
  • dx,dy:當組合為dx=1,dy=0時求x方向的一階導數,當組合為dx=0,dy=1時求y方向的一階導數(如果同時為1,通常得不到想要的結果)
  • ksize:(可選參數)Sobel算子的大小,必須是1,3,5或者7,默認為3。
  • scale:(可選參數)將梯度計算得到的數值放大的比例係數,效果通常使梯度圖更亮,默認為1
  • delta:(可選參數)在將目標圖像存儲進多維數組前,可以將每個像素值增加delta,默認為0
  • borderType:(可選參數)決定圖像在進行濾波操作(卷積)時邊沿像素的處理方式,默認為BORDER_DEFAULT

[補充] 圖像深度是指存儲每個像素值所用的位數,例如cv2.CV_8U,指的是8位無符號數,取值範圍為0~255,超出範圍則會被截斷(截斷指的是,當數值大於255保留為255,當數值小於0保留為0,其餘不變)。

具體還有:CV_16S(16位無符號數),CV_16U(16位有符號數),CV_32F(32位浮點數),CV_64F(64位浮點數)

canny 邊緣檢測

需要設定兩個閾值:minVal和maxVal。當影象的灰度梯度高於maxVal時被認為是真的邊界,那些低於minVal的邊界會被拋棄。如果介於兩者之間的話,就要看這個點是否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是就拋棄。

cv2.Canny(input_image, threshold1, threshold2)

參考資料

https://docs.opencv.org/master/d9/d61/tutorial_py_morphological_ops.html

https://zh.codeprj.com/blog/a20f6a1.html

https://www.itread01.com/content/1548037803.html

https://www.twblogs.net/a/5d7e84e3bd9eee5327ffd73e

https://blog.csdn.net/weixin_42216109/article/details/89642914

--

--

Iris

Machine/Deep Learning, Image Processing and Computer Vision