Python OpenCV 圖像的二值化操作再次學習與圖像平滑處理(卷積處理)

      網友投稿 1338 2022-05-29

      Python OpenCV 365 天學習計劃,與橡皮擦一起進入圖像領域吧。本篇博客是這個系列的第 44 篇。

      基礎知識鋪墊

      今天再去回顧 上一篇 寫二值化操作的博客,內容還是稚嫩了一些,果然第一遍的學習只是掌握了一丟丟的皮毛,還有很多細節的知識點需要補充。

      二值化學習迭代

      首先還是對 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 。

      Python OpenCV 圖像的二值化操作再次學習與圖像平滑處理(卷積處理)

      但是該操作你也會發現一個問題,就是邊緣是無法湊到卷積核 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:夢想橡皮擦,希望大家

      、

      評論

      、

      。

      OpenCV Python 神經網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:關系數據庫——基礎
      下一篇:Windows內存體系(1) -- 虛擬地址空間
      相關文章
      久久亚洲精品中文字幕无码| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲综合色自拍一区| 亚洲高清视频一视频二视频三| 亚洲熟妇无码一区二区三区| 亚洲免费福利在线视频| 亚洲精品二三区伊人久久| 亚洲国产成+人+综合| 亚洲毛片基地4455ww| 亚洲精品中文字幕无乱码麻豆| 国产亚洲sss在线播放| 亚洲无人区码一二三码区别图片| 亚洲国产精品免费观看 | 亚洲中文字幕在线观看| 亚洲乱码一区二区三区在线观看| 国产亚洲自拍一区| 亚洲熟妇无码乱子AV电影| 在线A亚洲老鸭窝天堂| 亚洲国产一二三精品无码| 亚洲成AV人片在| 亚洲最新永久在线观看| 亚洲码在线中文在线观看| 亚洲国产中文在线视频| 亚洲国产系列一区二区三区| 亚洲av无码兔费综合| 激情小说亚洲图片| 亚洲精品无码专区久久同性男| 久久亚洲精品无码播放| 亚洲精品中文字幕无码蜜桃| 亚洲av永久无码精品网站| 久久亚洲精品国产精品黑人| 亚洲狠狠狠一区二区三区| 天堂亚洲国产中文在线| yy6080亚洲一级理论| 中文字幕第13亚洲另类| 亚洲国产精品第一区二区| 亚洲成aⅴ人在线观看| 国产亚洲福利在线视频| 国产偷国产偷亚洲高清在线| 伊人久久亚洲综合| 亚洲激情在线视频|