opencv 二值化图像详解 一文看懂各种二值化方法
本文介紹使用不同的閾值方法“二值化”圖像
固定閾值分割
圖解
代碼
import cv2 as cv# 讀入灰度圖像 img = cv.imread('baby_g.jpg', 0)# 閾值127分割圖像 ret, th = cv.threshold(img, 127, 255, cv.THRESH_BINARY) cv.imshow('thresh', th) cv.waitKey(0) cv.destroyAllWindows()函數(shù)講解
cv.threshold()用來實(shí)現(xiàn)閾值分割,ret是return value縮寫,代表當(dāng)前的閾值,暫時(shí)不用理會(huì)。函數(shù)有4個(gè)參數(shù):
參數(shù)1:要處理的原圖,一般是灰度圖
參數(shù)2:設(shè)定的閾值
參數(shù)3:最大閾值,一般為255
參數(shù)4:閾值的方式,主要有5種。
cv.threshold() 參數(shù)4閾值方式詳解
實(shí)驗(yàn)
import cv2 as cv import matplotlib.pyplot as pltimg = cv.imread('gradient.jpg',0)# 應(yīng)用5種不同的閾值方法 ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY) ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV) ret, th3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC) ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO) ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] images = [img, th1, th2, th3, th4, th5]# 使用Matplotlib顯示 for i in range(6):plt.subplot(2, 3, i + 1)plt.imshow(images[i], 'gray')plt.title(titles[i], fontsize=8)plt.xticks([]), plt.yticks([]) # 隱藏坐標(biāo)軸plt.show()實(shí)驗(yàn)輸出
官網(wǎng)中的說明
一點(diǎn)說明
很多人誤以為閾值分割就是二值化。從上圖中可以發(fā)現(xiàn),兩者并不等同,閾值分割結(jié)果是兩類值,而不是兩個(gè)值,所以教程開頭我把二值化加了引號(hào)。
自適應(yīng)閾值
簡介及函數(shù)說明
看得出來固定閾值是在整幅圖片上應(yīng)用一個(gè)閾值進(jìn)行分割,它并不適用于明暗分布不均的圖片。 cv.adaptiveThreshold()自適應(yīng)閾值會(huì)每次取圖片的一小部分計(jì)算閾值,這樣圖片不同區(qū)域的閾值就不盡相同。它有5個(gè)參數(shù):
參數(shù)1:要處理的原圖
參數(shù)2:最大閾值,一般為255
參數(shù)3:小區(qū)域閾值的計(jì)算方式
ADAPTIVE_THRESH_MEAN_C:小區(qū)域內(nèi)取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小區(qū)域內(nèi)加權(quán)求和,權(quán)重是個(gè)高斯核
參數(shù)4:閾值方式(跟前面講的那5種相同)
參數(shù)5:小區(qū)域的面積,如11就是11*11的小塊
參數(shù)6:最終閾值等于小區(qū)域計(jì)算出的閾值再減去此值
實(shí)驗(yàn)
import cv2 as cv import matplotlib.pyplot as pltimg = cv.imread('paojie_g.jpg',0)# 固定閾值 ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY) # 自適應(yīng)閾值 th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 4) th3 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 8)titles = ['Original', 'Global(v = 127)', 'Adaptive Mean', 'Adaptive Gaussian'] images = [img, th1, th2, th3]for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')plt.title(titles[i], fontsize=8)plt.xticks([]), plt.yticks([]) plt.show()實(shí)驗(yàn)結(jié)果
Otsu 閾值
原理及python手動(dòng)實(shí)現(xiàn)
手動(dòng)實(shí)現(xiàn)Otsu閾值法
實(shí)驗(yàn)
import cv2 as cv import numpy as np# Read image img = cv.imread("paojie_g.jpg",0) # Otsu's binarization of Opencv ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) print("threshold >>", ret2) # Save result cv.imwrite("out.jpg", th2) cv.imshow("result", th2) cv.waitKey(0) cv.destroyAllWindows()實(shí)驗(yàn)結(jié)果
都看到這里了,點(diǎn)個(gè)贊再走唄。
總結(jié)
以上是生活随笔為你收集整理的opencv 二值化图像详解 一文看懂各种二值化方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab安装与下载
- 下一篇: Intel 实习mentor布置问题1