opencv二值化详解
二值化
學習了二值化,我通過看了很多資料,希望通過總結和大家一起學習,一起努力,有錯誤,希望大家指正
在處理圖片操作時,二值化在圖片領域占有很大作用
在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓
opencv中,提供了多種二值化方法
以8位圖為例(即值為0-255)
| 方法two: cv2.THRESH_BINARY_INV | 像素灰度值小于閾值全為255,大于閾值全為0 |
| 方法tree: cv2.THRESH_TRUNC | 像素灰度值小于閾值不變,大于閾值變為閾值 |
| 方法four: cv2.THRESH_TOZERO | 像素灰度值小于閾值不做任何改變,大于閾值全為0 |
| 方法five: cv2.THRESH_TOZERO_INV | 像素灰度值小于閾值全為0,大于閾值不做任何改變 |
公式如下
二值化方法
cv2.threshold(src, thresh, maxval, type)
src: 圖片源
thresh: 閾值
maxval: 指當像素值高于(有時是小于)閾值時應該被賦予的新的像素值
type: 表示的是這里劃分的時候使用的是什么類型的算法,常用值為0(cv2.THRESH_BINARY)
OTSU算法
一般,我們不知道用什么閾值可以獲得更好的二值化圖像.OTSU會通過一系列計算,計算出,比較優的閾值(可以理解為,在
圖像直方圖中,如果存在兩峰,那么,我們的閾值應該盡可能的在兩峰之間的峰谷).因此,對于非雙峰圖,用這種方法可能效果
不太理想
OTSU是計算二值化的算法,計算二值化的算法有很多,一般使用OTSU
下面使用OTSU算法實現THRESH_BINARY二值化
import cv2 as cv path='' image=cv.imread(path) image=cv.cvtColor(image,cv.COLOR_RGB2GRAY) ret,binary=cv.threshold(image,0,255,cv.THRESH_BINARY + cv.THRESH_OTSU) print('峰值為:',ret) # ret為OTSU算法得出的閾值 cv.imshow('THRESH_BINRY',binary) cv.waitKey(0) cv.destroyAllWindows()下面不適應OTSU算法實現THRESH_TRUNC
import cv2 as cv path='' image=cv.imread(path) image=cv.cvtColor(image,cv.COLOR_RGB2GRAY) ret,binary=cv.threshold(image,127,255,cv.THRESH_TRUNC) # 這里指定127為閾值 print('峰值為:',ret) # ret為閾值 cv.imshow('THRESH_BINRY',binary) cv.waitKey(0) cv.destroyAllWindows()以上為全局二值化,下面介紹一下,局部二值化
局部二值化方法
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
src: 圖像源
maxValue: 灰度像素值上限,舉例為8位圖(255)
adaptiveMethod: 自適應算法:兩種{1:cv2.ADAPTIVE_THRESH_MEAN_C 采用領域內均值2:cv2.ADAPTIVE_THRESH_GAUSSIAN_C 采用領域內像素加權和,權重為高斯窗口}
thresholdType: 為二值化算法,只適用于(cv2.THRESH_BINARY and cv2.THRESH_BINARY_INV)
blockSize: 領域大小,為正方形
C: 閾值等于均值或者加權值減去這個常數(為0相當于閾值 就是求得領域內均值或者加權值)
這種方法理論上得到的效果更好,相當于在動態自適應的調整屬于自己像素點的閾值,而不是整幅圖像都用一個閾值。
以上是我學習二值化后的一些總結,不好之處,歡迎評論,一起學習
總結
以上是生活随笔為你收集整理的opencv二值化详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OTSU 获取最佳阈值,及opencv二
- 下一篇: qsnctf 2048 wp