影象二值化(python+opencv)
定義:影象的二值化,就是將影象上的畫素點的灰度值設定為0或255,也就是將整個影象呈現出明顯的只有黑和白的視覺效果。
一幅影象包括目標物體、背景還有噪聲,要想從多值的數字影象中直接提取出目標物體,常用的方法就是設定一個閾值T,用T將影象的資料分成兩部分:大於T的畫素群和小於T的畫素群。這是研究灰度變換的最特殊的方法,稱為影象的二值化(Binarization)。
全域性閾值:
Python-OpenCV中提供了閾值(threshold)函式:cv2.threshold(src, threshold, maxValue, method)
src原圖:破折線為將被閾值化的值;虛線為閾值
cv2.THRESH_BINARY:大於閾值的畫素點的灰度值設定為maxValue(如8位灰度值最大為255),灰度值小於閾值的畫素點的灰度值設定為0。
cv2.THRESH_BINARY_INV :大於閾值的畫素點的灰度值設定為0,而小於該閾值的設定為maxValue。
cv2.THRESH_TRUNC:畫素點的灰度值小於閾值不改變,大於閾值的灰度值的畫素點就設定為該閾值。
cv2.THRESH_TOZERO:畫素點的灰度值小於該閾值的不進行任何改變,而大於該閾值的部分,其灰度值全部變為0。
cv2.THRESH_TOZERO_INV:畫素點的灰度值大於該閾值的不進行任何改變,畫素點的灰度值小於該閾值的,其灰度值全部變為0。
Python+opencv程式碼:
def getPicMinRect(pic):
GrayImage = np.array(pic).reshape(40,40).astype(np.uint8)
ret,thresh1=cv2.threshold(GrayImage,10,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(GrayImage,10,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(GrayImage,10,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(GrayImage,10,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(GrayImage,10,255,cv2.THRESH_TOZERO_INV)
titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [GrayImage, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
自適應閾值:
當同一幅影象上的不同部分的具有不同亮度時。這種情況下我們需要採用自適應閾值。此時的閾值是根據影象上的每一個小區域計算與其對應的閾值。因此在同一幅影象上的不同區域採用的是不同的閾值,從而使我們能在亮度不同的情況下得到更好的結果。
Python-OpenCV中提供了閾值(threshold)函式:cv2.adaptiveThreshold(src, maxValue, adaptive_method, threshold_type, block_size, param1)
好吧,這玩意的threshold_type其實就兩種:CV_THRESH_BINARY, CV_THRESH_BINARY_INV
adaptive_method也有兩種: CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C
函式 cvAdaptiveThreshold 將灰度影象變換到二值影象,採用下面公式:
switch(threshold_type):
case CV_THRESH_BINARY:
if src(x,y)>T(x,y):
dst(x,y) = maxValue
else:
dsy(x,y) = 0
case CV_THRESH_BINARY_INV:
if src(x,y)>T(x,y):
dst(x,y) = 0
else:
dsy(x,y) = maxValue
其中 T(x,y)為當前畫素點單獨計算的閾值
對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出block中的均值,再減掉param1。
對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出block中的加權和(gaussian), 再減掉param1。
Python+opencv程式碼:
def getPic(pic):
GrayImage = np.array(pic).reshape(40,40).astype(np.uint8)
th1 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,5)
th2 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,50)
th3 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,5)
th4 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,50)
titles = ['Gray Image', 'Adaptive Mean prama1=5',
'Adaptive Mean prama1=50', 'Adaptive Gaussian prama1=5','Adaptive Gaussian prama1=50']
images = [GrayImage, th1, th2, th3, th4]
for i in xrange(5):
plt.subplot(2,3,i+1),plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
相關文章
- Python+OpenCV 影象風格遷移(模仿名畫)PythonOpenCV
- [Python影象處理] 七.影象閾值化處理及演算法對比Python演算法
- [影象處理] Python+OpenCV實現車牌區域識別及Sobel運算元PythonOpenCV
- python+opencv檢測圖片中二維碼PythonOpenCV
- python - 圖片灰度化、二值化Python
- matlab中將RGB影象轉化為灰度影象Matlab
- 網格缺陷檢測(二值化閾值分析)
- 【查蟲日誌】快速判斷一副灰度影象中是否只有黑色和白色值(即是否為二值影象)過程中bool變數的是是非非。變數
- 譯文:影象優化(上)優化
- 彩色影像二值化函式(matlab)函式Matlab
- 數值最優化—優化問題的解(二)優化
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- OpenCV之影象直方圖均衡化OpenCV直方圖
- 影象的卷積和池化操作卷積
- [work] 影象縮放——雙線性插值演算法演算法
- Android影像灰度化、線性灰度變化、二值化處理方法Android
- 使用matlab對影像進行二值化處理Matlab
- C++ OpenCv二值化找圓心座標C++OpenCV
- AI繪畫第二彈——影象風格遷移AI
- 第二屆學習影象壓縮挑戰賽
- 二值影像
- [Python影象處理] 八.影象腐蝕與影象膨脹Python
- 影象處理之影象增強
- python+opencv邊緣檢測方法整理PythonOpenCV
- 二、插值操作
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- 繪製影象
- iHSMarket:全球CMOS影象感測器價值120億美元 索尼份額超50%
- python示例 呼叫影象識別服務識別影象Python
- [Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素PythonOpenCV
- Bmp讀寫二值圖
- ZOJ——Copying Books 最大值最小化問題 (貪心 + 二分)
- activity影象亂碼
- EasyDL定製化影象識別,應用在哪兒?怎麼用?
- MATLAB一維插值和二維插值 比較Matlab
- 11_二值選擇模型模型
- 影象處理入門:目標檢測和影象檢索綜述
- 二元函式的極值與最值問題函式