圖像處理閾值-opencv實現

三種閾值

簡單閾值:是固定一個閾值(一個數)
自適應閾值:閾值即取相鄰領域(小鄰域-閾值)(很多閾值)
Otsu’s二值化:是自己學習一個閾值(一個數)

簡單閾值

正如它的名字,直接根據給定的閾值進行判斷,大於則爲1,小於則爲0。之前使用的熟悉的閾值函數cv2.threshold()便是這種。 這裏簡單回顧。其第一個參數是需要二值化的圖像,第二個參數是閾值,第三個參數是當像素值高於(或小於)閾值時應該被賦予的 新像素值。OpenCV提供了多種不同的閾值方法。我們之前用的便是cv2.THRESH_BINARY。函數的返回值有兩個,第二個即爲二值化 以後的圖像。因此不能只用一個變量接收這個函數的返回值,否則會報錯的。同時需要注意的是,傳入函數的圖像應該是灰度圖像, 而不是RGB圖像,RGB的話需要先轉換成灰度再傳入,否則可能得到的不是你想要的結果。

import numpy as np
import cv2
from matplotlib import pyplot as plt

gray = cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/gray.jpg")

ret, thresh1 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(gray, 128, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(gray, 128, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(gray, 128, 255, cv2.THRESH_TOZERO_INV)

titles = ['original', 'binary', 'binary_inv', 'trunc', 'tozero', 'tozero_inv']
imgs = [gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(3, 2, i + 1), plt.imshow(imgs[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([]) #去除座標軸
plt.show()

在這裏插入圖片描述

自適應閾值

OpenCV中自適應閾值採用cv2.adaptiveThreshold() 函數實現。OpenCV中內置了兩種自適應方法,分別是cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C。 MEAN_C方法很簡單,閾值即取相鄰領域的平均值。GAUSSIAN_C方法閾值同樣取自相鄰領域,只是不再是平均值,而是加權平均, 權重爲一個高斯窗口。所謂高斯窗口就是要讓窗口服從二維的高斯正態分佈。

import numpy as np
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg")
#圖像縮放函數 :4x4像素鄰域的雙三次插值
resize = cv2.resize(img, None, fx=0.6, fy=0.6, interpolation=cv2.INTER_CUBIC)

gray = cv2.cvtColor(resize, cv2.COLOR_BGR2GRAY)

ret, th1 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)#ret=128
"""
# 第一個參數是需要二值化的圖像,注意要是灰度圖
# 第二個參數是大於閾值時應該被賦予的值
# 第三個參數是閾值計算方法,MEAN或GAUSSIAN二選一
# 第四個參數是閾值顯示方法,只能是BINARY或BINARY_INV二選一
# 第五個參數是領域大小,注意必須是奇數,該值越大,保留的細節越少。
# 第六個參數是自定義的常數
"""
th2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)
th3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 2)
cv2.imshow("original", resize)
cv2.imshow("th_binary", th1)
cv2.imshow("mean", th2)
cv2.imshow("gauss", th3)
cv2.waitKey(0)

在這裏插入圖片描述

Otsu’s二值化

Otsu’s簡單來說就是對一幅雙峯圖像自動根據其灰度分佈直方圖計算出一個最合適的二值化閾值。對於非 雙峯圖像,這種方法的效果可能不理想。 在使用時,我們需要多傳入一個參數:cv2.THRESH_OTSU,並且要把閾值設爲0。然後程序便會根據算法找到 最優閾值,並返回給retVal。如果不使用Otsu二值化,返回的值便於我們設定的相等。

import numpy as np
import cv2
from matplotlib import pyplot as plt
imggray= cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg",0)
# 注意還要再加上一個參數
ret1, th1 = cv2.threshold(imggray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret2, th2 = cv2.threshold(imggray, 128, 255, cv2.THRESH_BINARY)
cv2.imshow("otsu", th1)
cv2.imshow("binary_128", th2)
cv2.waitKey(0)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章