生活随笔
收集整理的這篇文章主要介紹了
opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基礎版筆記鏈接:
python3+opencv學習筆記匯總目錄(適合基礎入門學習)
進階版筆記目錄鏈接:
python+opencv進階版學習筆記目錄(適合有一定基礎)
基礎版二值化講解
opencv學習筆記10:閾值分割
圖像二值化原理
二值化方法:全局閾值,局部閾值
具體原理見上面鏈接
圖像二值化實現
1.全局閾值
通常情況,我們一般不知道設定怎樣的閾值thresh才能得到比較好的二值化效果,只能去試。如對于一幅雙峰圖像(理解為圖像直方圖中存在兩個峰),我們指定的閾值應盡量在兩個峰之間的峰谷。這時,就可以用第四個參數THRESH_OTSU,它對一幅雙峰圖像自動根據其直方圖計算出合適的閾值(對于非雙峰圖,這種方法得到的結果可能不理想)。
對于雙峰圖,我們需要多傳入一個參數cv2.THRESH_OTSU,并且把閾值thresh設為0,設置為其他數也默認為0,算法會找到最優(yōu)閾值,并作為第一個返回值ret返回。
cv2.THRESH_BINARY:二進制閾值。把亮的處理成白色,暗的處理成黑色
cv2.THRESH_BINARY_INV:反二進制閾值。把亮的處理成黑色,暗的處理成白色
cv2.THRESH_TRUNC:截斷閾值。亮的不能太亮,有上限,暗的不變
cv2.THRESH_TOZERO_INV:threshold 反閾值化為0,把比較亮的部分處理成0成黑色,小于等于閾值的像素點不變
cv2.THRESH_TOZERO:threshold 閾值化為0,比較亮的部分不變,比較暗的部分處理成黑色為0
import cv2
as cv
import numpy
as np
def threshold_demo(image
):gray
= cv
.cvtColor
(image
, cv
.COLOR_BGR2GRAY
)ret
, binary
= cv
.threshold
(gray
, 127, 255, cv
.THRESH_BINARY
|cv
.THRESH_OTSU
)print("threshold value %s"%ret
)cv
.imshow
("binary", binary
)print("--------- Python OpenCV Tutorial ---------")
src
= cv
.imread
("duoren.jpg")
cv
.namedWindow
("input image", cv
.WINDOW_AUTOSIZE
)
cv
.imshow
("input image", src
)
threshold_demo
(src
)
cv
.waitKey
(0)
cv
.destroyAllWindows
()
圖像直方圖
該圖沒有明顯兩個波峰,將就用
結果
二進制閾值
修改cv.THRESH_BINARY為其他參數。結果如下
cv2.THRESH_BINARY_INV:反二進制閾值
cv2.THRESH_TRUNC:截斷閾值
cv2.THRESH_TOZERO_INV: 反閾值化為0
cv2.THRESH_TOZERO:閾值化為0
2.局部閾值 自適應閾值
cv2.adaptiveThreshold()
ADAPTIVE_THRESH_MEAN_C :把圖像分成一個個小的區(qū)域,每個區(qū)域做閾值處理,每個區(qū)域閾值為這個區(qū)域的均值減去常量c,大于閾值取白色,小于取黑色。整個圖像有很多閾值。
ADAPTIVE_THRESH_GAUSSIAN_C:把圖像分成一個個小的區(qū)域,閾值是每個區(qū)域均值的權重和(均值分布為高斯分布,越接近中心均值權重越高)再減去常量c,整個圖像只有一個閾值
blocksize:區(qū)域大小,必須是奇數。
C: 二值化時,如何一個像素點減去均值大于C,才把這個點設為白色,能減弱噪聲影響。等于說閾值=均值-C
import cv2
as cv
import numpy
as np
def local_threshold(image
):gray
= cv
.cvtColor
(image
, cv
.COLOR_BGR2GRAY
)binary
= cv
.adaptiveThreshold
(gray
, 255, cv
.ADAPTIVE_THRESH_GAUSSIAN_C
, cv
.THRESH_BINARY
, 25, 10)cv
.imshow
("binary", binary
)
print("--------- Python OpenCV Tutorial ---------")
src
= cv
.imread
("duoren.jpg")
cv
.namedWindow
("input image", cv
.WINDOW_AUTOSIZE
)
cv
.imshow
("input image", src
)
local_threshold
(src
)
cv
.waitKey
(0)
cv
.destroyAllWindows
()
換一張經典圖
自適應閾值結果
全局閾值結果
首先還是自適應閾值吧。
3.自定義閾值
自己實現一個二值化處理
import cv2
as cv
import numpy
as np
def custom_threshold(image
):gray
= cv
.cvtColor
(image
, cv
.COLOR_BGR2GRAY
)h
, w
= gray
.shape
[:2]m
= np
.reshape
(gray
, [1, w
*h
])mean
= m
.sum() / (w
*h
)print("mean : ", mean
)ret
, binary
= cv
.threshold
(gray
, mean
, 255, cv
.THRESH_BINARY
)cv
.imshow
("binary", binary
)print("--------- Python OpenCV Tutorial ---------")
src
= cv
.imread
("duoren.jpg")
cv
.namedWindow
("input image", cv
.WINDOW_AUTOSIZE
)
cv
.imshow
("input image", src
)
custom_threshold
(src
)
cv
.waitKey
(0)
cv
.destroyAllWindows
()
超大圖像二值化
方法:圖像分塊,再分別閾值
圖超大時,由于光照不能很好分布全圖,所以有很多噪聲。
import cv2
as cv
import numpy
as np
def big_image_binary(image
):print(image
.shape
)cw
= 256ch
= 256h
, w
= image
.shape
[:2]gray
= cv
.cvtColor
(image
, cv
.COLOR_BGR2GRAY
)for row
in range(0, h
, ch
):for col
in range(0, w
, cw
):roi
= gray
[row
:row
+ch
, col
:cw
+col
]dev
= np
.std
(roi
)if dev
< 15:gray
[row
:row
+ ch
, col
:cw
+ col
] = 255else:ret
, dst
= cv
.threshold
(roi
, 0, 255, cv
.THRESH_BINARY
| cv
.THRESH_OTSU
)gray
[row
:row
+ ch
, col
:cw
+ col
] = dstcv
.imshow
('result_binary',gray
)
print("--------- Python OpenCV Tutorial ---------")
src
= cv
.imread
("limi.jpg")
cv
.namedWindow
("input image", cv
.WINDOW_AUTOSIZE
)
cv
.imshow
("input image", src
)
big_image_binary
(src
)
cv
.waitKey
(0)
cv
.destroyAllWindows
()
說明
下面代碼是去除圖像空白小塊區(qū)域噪聲。如果一個小塊沒有其他東西,那么它的方差就很小,去除一些小黑點(去噪)
if dev < 15:gray[row:row + ch, col:cw + col] = 255#去除空白區(qū)域的噪點
電氣專業(yè)的計算機萌新,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下。謝謝。
總結
以上是生活随笔為你收集整理的opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。