您好,登錄后才能下訂單哦!
這篇文章運(yùn)用簡單易懂的例子給大家介紹使用Python+OpenCV如何實(shí)現(xiàn)圖像二值化,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
簡介:圖像二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果的過程。
普通圖像二值化
代碼如下:
import cv2 as cv import numpy as np #全局閾值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把輸入圖像灰度化 #直接閾值化是對輸入的單通道矩陣逐像素進(jìn)行閾值分割。 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) print("threshold value %s"%ret) cv.namedWindow("binary0", cv.WINDOW_NORMAL) cv.imshow("binary0", binary) #局部閾值 def local_threshold(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把輸入圖像灰度化 #自適應(yīng)閾值化能夠根據(jù)圖像不同區(qū)域亮度分布,改變閾值 binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10) cv.namedWindow("binary1", cv.WINDOW_NORMAL) cv.imshow("binary1", binary) #用戶自己計(jì)算閾值 def custom_threshold(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把輸入圖像灰度化 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.namedWindow("binary2", cv.WINDOW_NORMAL) cv.imshow("binary2", binary) src = cv.imread('E:/imageload/kobe.jpg') cv.namedWindow('input_image', cv.WINDOW_NORMAL) #設(shè)置為WINDOW_NORMAL可以任意縮放 cv.imshow('input_image', src) threshold_demo(src) local_threshold(src) custom_threshold(src) cv.waitKey(0) cv.destroyAllWindows()
運(yùn)行結(jié)果:
注意:
1.全局閾值
①OpenC的threshold函數(shù)進(jìn)行全局閾值。其函數(shù)原型為:threshold(src, thresh, maxval, type[, dst]) -> retval, dst
src參數(shù)表示輸入圖像(多通道,8位或32位浮點(diǎn))。
thresh參數(shù)表示閾值。
maxval參數(shù)表示與THRESH_BINARY和THRESH_BINARY_INV閾值類型一起使用設(shè)置的最大值。
type參數(shù)表示閾值類型。
retval參數(shù)表示返回的閾值。若是全局固定閾值算法,則返回thresh參數(shù)值。若是全局自適應(yīng)閾值算法,則返回自適應(yīng)計(jì)算得出的合適閾值。
dst參數(shù)表示輸出與src相同大小和類型以及相同通道數(shù)的圖像。
②type參數(shù)閾值類型這部分參考博客:https://blog.csdn.net/iracer/article/details/49232703 ,寫的很不錯(cuò)。
閾值類型:
閾值類型圖示:
③type參數(shù)單獨(dú)選擇上述五種閾值類型時(shí),是固定閾值算法,效果比較差。
此外還有自適應(yīng)閾值算法:(自適應(yīng)計(jì)算合適的閾值,而不是固定閾值)
比如結(jié)合cv.THRESH_OTSU,寫成cv.THRESH_BINARY | cv.THRESH_OTSU。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #大律法,全局自適應(yīng)閾值,第二個(gè)參數(shù)值0可改為任意數(shù)字但不起作用。
比如結(jié)合cv.THRESH_TRIANGLE,寫成cv.THRESH_BINARY | cv.THRESH_TRIANGLE。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) #TRIANGLE法,全局自適應(yīng)閾值,第二個(gè)參數(shù)值0可改為任意數(shù)字但不起作用,適用于單個(gè)波峰。
補(bǔ):
cv.THRESH_OTSU和cv.THRESH_TRIANGLE也可單獨(dú)使用,不一定要寫成和固定閾值算法結(jié)合的形式。單獨(dú)寫和結(jié)合起來寫,都是自適應(yīng)閾值算法優(yōu)先。
例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU) #大律法 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TRIANGLE) #TRIANGLE法
2.局部閾值
OpenCV的adaptiveThreshold函數(shù)進(jìn)行局部閾值。函數(shù)原型為:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
src參數(shù)表示輸入圖像(8位單通道圖像)。
maxValue參數(shù)表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod參數(shù)表示自適應(yīng)閾值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。
thresholdType參數(shù)表示閾值類型,必須為THRESH_BINARY或THRESH_BINARY_INV的閾值類型。
blockSize參數(shù)表示塊大?。ㄆ鏀?shù)且大于1,比如3,5,7........ )。
C參數(shù)是常數(shù),表示從平均值或加權(quán)平均值中減去的數(shù)。 通常情況下,這是正值,但也可能為零或負(fù)值。
補(bǔ):在使用平均和高斯兩種算法情況下,通過計(jì)算每個(gè)像素周圍blockSize x blockSize大小像素塊的加權(quán)均值并減去常量C即可得到自適應(yīng)閾值。如果使用平均的方法,則所有像素周圍的權(quán)值相同;如果使用高斯的方法,則每個(gè)像素周圍像素的權(quán)值則根據(jù)其到中心點(diǎn)的距離通過高斯方程得到。
參考:https://blog.csdn.net/guduruyu/article/details/68059450
3.numpy的reshape函數(shù)是給數(shù)組一個(gè)新的形狀而不改變其數(shù)據(jù),函數(shù)原型:reshape(a, newshape, order='C')
a參數(shù)表示需要重新形成的原始數(shù)組。
newshape參數(shù)表示int或int類型元組(tuple),若為(1, 3),表示生成的新數(shù)組是1行3列。
order參數(shù)表表示使用此索引順序讀取a的元素,并使用此索引順序?qū)⒃胤胖玫街匦滦纬傻臄?shù)組中。
函數(shù)返回值:如果可能的話,這將是一個(gè)新的視圖對象; 否則,它會成為副本。
關(guān)于使用Python+OpenCV如何實(shí)現(xiàn)圖像二值化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。