Python OpenCV 365 天學習計劃,與橡皮擦一起進入影像領域吧,本篇博客是這個系列的第 44 篇,
該系列文章導航參考:https://blog.csdn.net/hihell/category_10688961.html
Python OpenCV
- 基礎知識鋪墊
- 二值化學習迭代
- 影像平滑處理學習迭代
- 方框濾波
- 橡皮擦的小節
基礎知識鋪墊
今天再去回顧 上一篇 寫二值化操作的博客,內容還是稚嫩了一些,果然第一遍的學習只是掌握了一丟丟的皮毛,還有很多細節的知識點需要補充,
二值化學習迭代
首先還是對 cv2.theshold 函式進行學習,函式原型與引數基礎部分,翻閱上篇博客即可,重點補充如下內容,
函式原型還是先參考一下:
retval, dst = cv2.threshold(src, thresh, maxval, type[, dst])
重點要說明的引數是 type,先回顧一下基本函式的基本使用代碼,畢竟有代碼才方便回顧內容:
import cv2 as cv
import numpy as np
src = cv.imread("./test.png")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
retval, dst = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
image = np.hstack((gray, dst))
cv.imshow("image", image)
cv.waitKey()
運行結果如下:

最后一個 type 引數是復習到的重點知識,它的取值影響了最終二值圖的結果,
在看一下 type 取值常見的有如下 5 個,這 5 個還可以分為三組,分別是
THRESH_BINARY與THRESH_BINARY_INV;THRESH_TRUNC;THRESH_TOZERO與THRESH_TOZERO_INV,
第一組中的兩個取值和第三組的兩個含義相同,都是相反的關系,因此看一個引數值即可,
THRESH_BINARY 最常用的,表示當像素點的值大于閾值 thresh 就取 maxval 設定的顏色,一般將 thresh 設定為 127,將 maxval 設定為 255,那 THRESH_BINARY 就會把所有灰度值大于 127 的都設定為 255,這里注意二值化操作的是灰度影像,雖然傳遞彩色影像也起作用,但是做二值化的時候,一定要提前把彩色影像轉換為二值影像才可,
THRESH_TOZERO 超過閾值的像素無變化,不大于的像素設定為 0,具體其實你進行一下簡單嘗試即可,
import cv2 as cv
import numpy as np
cv.namedWindow("image",cv.WINDOW_FREERATIO)
src = cv.imread("./test.png")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
retval1, dst1 = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
retval2, dst2 = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)
image = np.hstack((dst1,dst2))
cv.imshow("image", image)
cv.waitKey()
使用該辦法,明顯會看到有些地方的灰度值得到了保留,注意 THRESH_TOZERO 是超過閾值的像素無變化,未超過的設定為 0 ,
與 THRESH_BINARY 對比之后得到的結論就是,黑的地方一起黑,白的地方你更白,
所以在使用 THRESH_TOZERO 的時候,寫成下面這個樣子也沒有什么問題,
retval2, dst2 = cv.threshold(gray, 127, 0, cv.THRESH_TOZERO)

THRESH_TRUNC 截斷閾值化,大于閾值部分設定為閾值,否則不變,測驗代碼如下:
retval1, dst1 = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
retval2, dst2 = cv.threshold(gray, 127, 0, cv.THRESH_TOZERO)
retval3, dst3 = cv.threshold(gray, 127, 0, cv.THRESH_TRUNC)
image = np.hstack((dst1,dst2,dst3))
對比之后,立馬就能明白,THRESH_TRUNC 會把圖片的灰度值上限設定成一個具體值,例如本案例中的 127,

影像平滑處理學習迭代
平滑處理即卷積操作,在 這篇博客 前后都有所涉及,再次學習的時候,我們將其進行一下補充,
在對影像進行去噪處理的時候,可以使用均值濾波,它是簡單的平均卷積操作,關于卷積數學相關的之后,在稍微后放 10 幾天的時間,在進行補充,因為接下來的內容很多地方都會有卷積,多學一些應用層的之后,再去復盤數學基礎,就事半功倍了,
雖然不涉及數學原理,但是咱還需要對底層實作進行一下基本的認知的,為了方便實作,我采用一張手動生成的灰度圖進行演示,
生成一張灰度圖的代碼:
import cv2 as cv
import numpy as np
# 生成一個10*10的灰度圖片
src = np.random.randint(256,size=(10, 10),dtype=np.uint8)
print(src)
cv.imshow("src",src)
因為是隨機生成的,輸出的代碼如下:
[[ 90 134 192 243 116 2 172 143 22 218]
[192 145 171 125 175 138 64 232 90 160]
[ 61 20 231 37 77 27 141 182 71 194]
[136 86 10 239 196 137 192 243 47 40]
[220 167 3 50 227 70 135 227 225 218]
[207 10 213 134 249 157 179 112 58 78]
[107 33 68 143 124 215 175 167 108 195]
[ 32 227 43 249 61 168 230 180 82 47]
[ 89 211 253 141 199 140 34 185 179 32]
[ 18 98 109 92 37 13 200 102 97 218]]
均值濾波默認會選擇一個 3x3 的卷積核,然后進行從左到右,從上到下的卷積操作,

上圖紅色的 137,就是進行均值濾波之后的結果,計算中心數字 145 周圍的 9 個數字之和,然后再除以 9,得到 137,替換掉 145 ,
但是該操作你也會發現一個問題,就是邊緣是無法湊到卷積核 3x3 的,這里橡皮擦也查閱了相關資料,存在的解釋就是邊緣填充,也就是前幾篇博客學習的內容,不過我進行嘗試之后,發現結果并不理想,抽時間還是要查閱一下 OpenCV 的原始碼,核對一下到底是什么計算方式,不過核心的思路已經比較清楚了,均值就是計算平均值,
由于它是該卷積核取九個值的平均值代替中間像素值,所以最終的效果是平滑的,將其應用到具體影像上,呈現如下效果,
import cv2 as cv
import numpy as np
cv.namedWindow("image",cv.WINDOW_FREERATIO)
src = cv.imread("./t1.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
dst = cv.blur(gray,(3,3))
image = np.hstack((gray,dst))
cv.imshow("image", image)
cv.waitKey()

卷積核大小設定成任意都是可以的,只不過建議設定為 3x3、5x5 這些奇數,
方框濾波
在之前的博客中貌似沒有涉及方框濾波的內容,這里在進行一下補充,與均值濾波用法基本一致,函式原型如下:
dst = cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])
可以選擇是否進行歸一化操作,具體代碼可以運行下述內容:
# 歸一化
dst = cv.boxFilter(gray,-1,(3,3),normalize=True)
# 不做歸一化
dst = cv.boxFilter(gray,-1,(3,3),normalize=False)
簡單說,不做歸一化操作,在使用 3x3 卷積核進行計算之后,不除以 9,像素越界,默認保留成 255,也就大白了,
高斯濾波就是增加了高斯分布相關的知識,或者增加了空間距離相關的概念,說白了就是像素周邊的像素權重不同了,相比于均值濾波,高斯濾波有著更好的平滑效果,
中值濾波就是把卷積核覆寫的矩陣進行從小到大排序,然后取中值為目標影像的像素值,
橡皮擦的小節
希望今天的 1 個小時你有所識訓,我們下篇博客見~
相關閱讀
技術專欄
- Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
- Python 爬蟲小課,精彩 9 講
今天是持續寫作的第 86 / 100 天,
如果你想跟博主建立親密關系,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯網高級網蟲,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
高級產品經理
互聯網從業者
業余編程愛好者
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261738.html
標籤:python
