網(wǎng)店代理靠譜嗎鄭州好的seo外包公司
二值化閾值調(diào)整:調(diào)整是指在進(jìn)行圖像二值化處理時(shí),調(diào)整閾值的過程。閾值決定了將圖像中的像素分為黑色和白色的界限,大于閾值的像素被設(shè)置為白色,小于等于閾值的像素被設(shè)置為黑色。
方法一:
取閾值為 127,相當(dāng)于 0~255 的中位數(shù)(0+255)/2 = 127,灰度值大于等于 127 的設(shè)置為 0,灰度值大于 127 的設(shè)置為 255,這種方法簡(jiǎn)單便捷,缺點(diǎn)就是閾值設(shè)置的太死板了,對(duì)于不同的照片,效果肯定不同。檢索資料的時(shí)候發(fā)現(xiàn),還有人把這種方法稱為 史上最弱智的二值處理方法,沒辦法,弱智方法也得學(xué)啊。
該方法會(huì)使用到一個(gè) threshold 方法,threshold 方法的語法格式如下:
cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
參數(shù)說明如下:
- src 輸入圖,中只能輸入單通道圖,一般就是灰度圖;
- thresh 閾值;
- maxval 最大值,當(dāng)像素超過了閾值(或者小于閾值)時(shí)所賦予的值;
- type - 二值化操作的類型,有 5 種,在下文描述;
- dst 輸出數(shù)組/圖像(與 src 相同大小和類型以及相同通道數(shù)的數(shù)組/圖像)。
返回值 retval 閾值 thresh, dst 經(jīng)過處理的圖像。
二值化操作類型type參數(shù)(閾值類型):
- 二進(jìn)制閾值化? ?THRESH_BINARY,過門限的值為最大值,其他值為 0;
- 反二進(jìn)制閾值化? ?THRESH_BINARY_INV,過門限的值為 0,其他值為最大值;
- 截?cái)嚅撝祷? ?THRESH_TRUNC,過門限的值為門限值,其他值不變;
- 閾值化為 0? ?THRESH_TOZERO,過門限的值不變,其他設(shè)置為 0;
- 反閾值化為 0? ?THRESH_TOZERO_INV,過門限的值為 0,其他不變。
以上內(nèi)容也叫做全局閾值。參考代碼:
import cv2
import matplotlib.pylab as pltdef main2():img = cv2.imread('6.jpg', 0)ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)titles = ['Original Image', 'BINARY','BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]for i in range(6):plt.subplot(2, 3, i+1)plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([])plt.yticks([])plt.show()main2()
當(dāng)然,也可以把代碼里面的127改成別的,這就叫手動(dòng)選擇閾值。
方法二:
計(jì)算像素點(diǎn)矩陣中的所有像素點(diǎn)的灰度值的平均值 avg,讓每一個(gè)像素點(diǎn)與 avg 比較,小于等于 avg 的像素點(diǎn)就為 0(黑色),大于 avg 的像素點(diǎn)為 255(白色),這種方法看起來靠譜了一些。
使用該方法之前需要先遍歷圖像的所有灰度值,才能計(jì)算出平均值。下圖所示的閾值計(jì)算結(jié)果是151.參考代碼如下:
import cv2def main():img = cv2.imread("1.TIF", 0)height, width = img.shape# 灰度值總和px_t = 0for i in range(height):for j in range(width):px_t += img[i][j]print(px_t)# 求像素平均值avg_thresh = int(px_t / (height * width))print(avg_thresh)thresh, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)cv2.imshow("dst", dst)cv2.waitKey()cv2.imwrite("2.jpg",dst)if __name__ == "__main__":main()