圖像二值化:基於圖像的直方圖來實現的,0白色 1黑色
一 二值化
定義:圖像的二值化,就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的只有黑和白的視覺效果。
一幅圖像包括目標物體、背景還有噪聲,要想從多值的數字圖像中直接提取出目標物體,常用的方法就是設定一個閾值T,用T將圖像的數據分成兩部分:大於T的像素群和小於T的像素群。這是研究灰度變換的最特殊的方法,稱為圖像的二值化(Binarization)。
二 閾值處理函數
Python-OpenCV中提供了閾值(threshold)函數
threshold(src, thresh, maxval, type, dst=None)
函數:第一個參數 src 指原圖像,原圖像應該是灰度圖。
第二個參數 x 指用來對像素值進行分類的閾值。
第三個參數 y 指當像素值高於(有時是小於)閾值時應該被賦予的新的像素值
第四個參數 Methods
method閾值類型一般分為五種:
- cv2.THRESH_BINARY——大於閾值的部分像素值變為最大值,其他變為0
- cv2.THRESH_BINARY_INV——大於閾值的部分變為0,其他部分變為最大值
- cv2.THRESH_TRUNC——大於閾值的部分變為閾值,其余部分不變
- cv2.THRESH_TOZERO——大於閾值的部分不變,其余部分變為0
- cv2.THRESH_TOZERO_INV——大於閾值的部分變為0,其余部分不變
三 全局閾值實例
import cv2 as cv import numpy as np # 全局閾值 def threshold_image(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原來", gray) # 大律法,全局自適應閾值 參數0可改為任意數字但不起作用 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) print("yuzhi:%s" % ret) cv.imshow("OTSU", binary) # TRIANGLE法,,全局自適應閾值, 參數0可改為任意數字但不起作用,適用於單個波峰 ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE) print("yuzhi:%s" % ret) cv.imshow("TRIANGLE", binary) # 自定義閾值為150,大於150的是白色 小於的是黑色 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY) print("yuzhi:%s" % ret) cv.imshow("define_yuzhi", binary) # 自定義閾值為150,大於150的是黑色 小於的是白色 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV) print("yuzhi:%s" % ret) cv.imshow("define_rev", binary) # 截斷 大於150的是改為150 小於150的保留 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC) print("yuzhi:%s" % ret) cv.imshow("jieduan1", binary) # 截斷 小於150的是改為150 大於150的保留 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO) print("yuzhi:%s" % ret) cv.imshow("jieduan2", binary) src = cv.imread("yiner.jpg") threshold_image(src) cv.waitKey(0) cv.destroyAllWindows()
函數threshold()的參數說明:
#大律法,全局自適應閾值 參數0可改為任意數字但不起作用 cv.THRESH_BINARY | cv.THRESH_OTSU #TRIANGLE法,,全局自適應閾值, 參數0可改為任意數字但不起作用,適用於單個波峰 cv.THRESH_BINARY | cv.THRESH_TRIANGLE # 自定義閾值為150,大於150的是白色 小於的是黑色 cv.THRESH_BINARY # 自定義閾值為150,大於150的是黑色 小於的是白色 cv.THRESH_BINARY_INV # 截斷 大於150的是改為150 小於150的保留 cv.THRESH_TRUNC # 截斷 小於150的是改為150 大於150的保留 cv.THRESH_TOZERO
對應的閾值
四 局部閾值處理
1 函數
adaptiveThreshold( src,
maxValue,
adaptiveMethod,
thresholdType,
blockSize,
C,
dst=None)
2 參數解說.
- 第一個src:原始圖像
- 第二個maxValue:像素值上限
- 第三個自適應方法adaptiveMethod:
— cv2.ADAPTIVE_THRESH_MEAN_C :領域內均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領域內像素點加權和,權 重為一個高斯窗口
- 第四個值的賦值方法:
只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
- 第五個blockSize
規定領域大小(一個正方形的領域) - 第六個常數C,
閾值等於均值或者加權值減去這個常數(為0相當於閾值 就是求得領域內均值或者加權值)
這種方法理論上得到的效果更好,相當於在動態自適應的調整屬於自己像素點的閾值,而不是整幅圖像都用一個閾值。
3 演示代碼
import cv2 as cv import numpy as np #局部閾值 def local_yuzhi(image): gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) cv.imshow('gray',gray) # ADAPTIVE_THRESH_MEAN_C 領域內均值 binary1=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10) cv.imshow('local1',binary1) # ADAPTIVE_THRESH_GAUSSIAN_C 領域內像素點加權和,權重為一個高斯窗口 binary2=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10) cv.imshow('local2',binary2) src = cv.imread("ying.jpg") local_yuzhi(src) cv.waitKey(0) cv.destroyAllWindows()
效果展示