opencv3 threshold函數閾值設定

threshold函數定義如下:
def threshold(src, thresh, maxval, type, dst=None):

第一個參數:src。
input array (multiple-channel, 8-bit or 32-bit floating point). 即爲輸入圖像,但需轉化爲8或32位單通道,即灰度圖像。

第二個參數:thresh。
threshold value.自己設定的閾值,這個閾值的對後面的操作有影響,而它的作用又需要第四個參數來指定。

第三個參數:maxval。
maximum value to use with the #THRESH_BINARY and #THRESH_BINARY_INV thresholding types.設定的最大閾值,當type設定爲特定的兩個值時,纔會起作用。

第四個參數:type。
thresholding type (see #ThresholdTypes).這個類型影響着兩個閾值。可以取以下幾個值:
THRESH_BINARY = 0
THRESH_BINARY_INV = 1
THRESH_MASK = 7
THRESH_OTSU = 8
THRESH_TOZERO = 3
THRESH_TOZERO_INV = 4
THRESH_TRIANGLE = 16
THRESH_TRUNC = 2
由於我也是初學OpenCV,目前只用到了前兩個,所以只對他們做介紹。

(1)當type設定爲cv2.THRESH_BINARY時,src中像素值大於thresh的像素點會設置爲maxval,小於thresh的設置爲0。
(2)當type設爲cv2.THRESH_BINARY_INV時,src中像素值大於thresh的設置爲0,而小於thresh的則設置爲maxval。和第一個參數相反。

我這裏做的是輪廓檢測(用矩形和圓形包圍目標的邊框),可以明顯看出閾值參數設置後的效果。我個人理解爲:如果圖片背景是深色,則設置爲THRESH_BINARY;若圖片背景是淺色,則type設置爲THRESH_BINARY_INV。

1. 深色背景

圖一是設置爲THRESH_BINARY的效果,圖二是設置爲THRESH_BINARY_INV的效果。
圖一
圖二
可以看出圖二根本沒有識別出目標,而是識別了圖片邊框,這顯然不是我們要的結果。

2. 淺色背景

圖一是設置爲THRESH_BINARY的效果,圖二是設置爲THRESH_BINARY_INV的效果。
圖一水果
圖二水果
當背景爲白色時,這裏的參數應設置爲THRESH_BINARY_INV。
我將部分代碼粘出:

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("images/fruit.jpg", cv2.IMREAD_UNCHANGED))
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY_INV)
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for con in contours:
    # 畫出簡單的邊界框,(x,y)座標,矩形高,寬
    x, y, w, h = cv2.boundingRect(con)
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 計算出包圍目標的最小矩形區域
    rect = cv2.minAreaRect(con)
    box = cv2.boxPoints(rect)
    
    # 將像素值轉爲int類型
    box = np.int0(box)
    cv2.drawContours(img, [box], 0, (0, 0, 255), 3)

    # 畫出最小閉圓
    (x, y), radius = cv2.minEnclosingCircle(c)  # 圓心座標和半徑
    center = (int(x), int(y))
    radius = int(radius)
    img = cv2.circle(img, center, radius, (0, 255, 0), 2)

cv2.drawContours(img, contours, -1, (255, 0, 0), 1)
發佈了10 篇原創文章 · 獲贊 11 · 訪問量 2839
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章