您好,登錄后才能下訂單哦!
小編給大家分享一下Python OpenCV閾值處理的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
圖像分割是許多計算機視覺應用中的關鍵處理步驟,通常用于將圖像劃分為不同的區域,這些區域常常對應于真實世界的對象。因此,圖像分割是圖像識別和內容分析的重要步驟。圖像閾值是一種簡單、有效的圖像分割方法,其中像素根據其強度值進行分區。在本文中,將介紹 OpenCV
所提供的主要閾值技術,可以將這些技術用作計算機視覺應用程序中圖像分割的關鍵部分。
閾值處理是一種簡單、有效的將圖像劃分為前景和背景的方法。圖像分割通常用于根據對象的某些屬性(例如,顏色、邊緣或直方圖)從背景中提取對象。最簡單的閾值方法會利用預定義常數(閾值),如果像素強度小于閾值,則用黑色像素替換,如果像素強度大于閾值,則用白色像素替換。OpenCV 提供了 cv2.threshold()
函數來對圖像進行閾值處理。
為了測試 cv2.threshold()
函數,首次創建測試圖像,其包含一些填充了不同的灰色調的大小相同的區域,利用 build_sample_image()
函數構建此測試圖像:
def build_sample_image(): """創建填充了不同的灰色調的大小相同的區域,作為測試圖像""" # 定義不同區域 tones = np.arange(start=50, stop=300, step=50) # 初始化 result = np.zeros((50, 50, 3), dtype="uint8") for tone in tones: img = np.ones((50, 50, 3), dtype="uint8") * tone # 沿軸連接數組 result = np.concatenate((result, img), axis=1) return result
接下來將使用不同的預定義閾值: 0 、 50 、 100 、 150 、 200 和 250 調用 cv2.threshold()
函數,以查看不同預定義閾值對閾值圖像影響。例如,使用閾值 thresh = 50
對圖像進行閾值處理:
ret1, thresh2 = cv2.threshold(gray_image, 50, 255, cv2.THRESH_BINARY)
其中,thresh2
是僅包含黑白色的閾值圖像。源圖像 gray_image
中灰色強度小于 50 的像素為黑色,強度大于 50 的像素為白色。
使用多個不同閾值對圖像進行閾值處理:
# 可視化函數 def show_img_with_matplotlib(color_img, title, pos): img_RGB = color_img[:, :, ::-1] ax = plt.subplot(7, 1, pos) plt.imshow(img_RGB) plt.title(title, fontsize=8) plt.axis('off') # 使用 build_sample_image() 函數構建測試圖像 image = build_sample_image() gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) for i in range(6): # 使用多個不同閾值對圖像進行閾值處理 ret, thresh = cv2.threshold(gray_image, 50 * i, 255, cv2.THRESH_BINARY) # 可視化 show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(i * 50), i + 2) # 可視化測試圖像 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img with tones of gray - left to right: (0,50,100,150,200,250)", 1) # 圖像進行閾值處理后,常見的輸出是黑白圖像 # 因此,為了更好的可視化效果,修改背景顏色 fig.patch.set_facecolor('silver') plt.show()
從上圖可以看出,根據閾值和樣本圖像灰度值的不同,閾值處理后生成的黑白圖像的變化情況。
上一節中,我們已經簡單介紹過了 OpenCV
中提供的簡單閾值處理函數——cv2.threshold()
,該函數用法如下:
cv2.threshold(src, thresh, maxval, type, dst=None) -> retval, dst
cv2.threshold()
函數對 src
輸入數組(可以為單通道或多通道圖像)應用預定義常數 thresh
設置的閾值;type
參數用于設置閾值類型,閾值類型的可選值如下:cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
、cv2.THRESH_TOZERO_INV
、cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
。
maxval
參數用于設置最大值,其僅在閾值類型為 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
時有效;需要注意的是,在閾值類型為 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
時,輸入圖像 src
應為為單通道。
為了更好的了解閾值操作的不同類型,接下來給出每種閾值類型的具體公式。符號說明:src
是源(原始)圖像,dst
對應于閾值化后的目標(結果)圖像,因此,src(x, y)
對應于源圖像像素 (x, y)
處的強度,而 dst(x, y)
對應于目標圖像像素 (x, y)
處的強度。
閾值類型 cv2.THRESH_BINARY
公式如下:
其表示,如果像素 src(x, y)
的強度高于 thresh
,則目標圖像像素強度 dst(x,y)
將被設為 maxval
;否則,設為 0
。
閾值類型 cv2.THRESH_BINARY_INV
公式如下:
其表示,如果像素 src(x, y)
的強度高于 thresh
,則目標圖像像素強度 dst(x,y)
將被設為 0
;否則,設為 maxval
。
閾值類型 cv2.THRESH_TRUNC
公式如下:
其表示,如果像素 src(x, y)
的強度高于 thresh
,則目標圖像像素強度設置為 threshold
;否則,設為 src(x, y)
。
閾值類型 cv2.THRESH_TOZERO
公式如下:
其表示,如果像素 src(x, y)
的強度高于 thresh
,則目標圖像像素值將設置為 src(x, y)
;否則,設置為 0
。
閾值類型 cv2.THRESH_TOZERO_INV
公式如下:
其表示,如果像素 src(x, y)
的強度大于 thresh
,則目標圖像像素值將設置為 0
;否則,設置為 src(x, y)
。
而 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
屬于特殊的閾值類型,它們可以與上述閾值類型( cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
和 cv2.THRESH_TOZERO_INV
)進行組合。組合后,閾值處理函數 cv2.threshold()
將只能處理單通道圖像,且計算并返回最佳閾值,而非指定閾值。
接下來使用不同閾值類型對同樣的測試圖像進行閾值處理,觀察不同閾值處理效果:
ret1, thresh2 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY) ret2, thresh3 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY) ret3, thresh4 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY_INV) ret4, thresh5 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY_INV) ret5, thresh6 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TRUNC) ret6, thresh7 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TOZERO) ret7, thresh7 = cv2.threshold(gray_image,100,255, cv2.THRESH_TOZERO_INV) # 可視化 show_img_with_matplotlib(cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 255", 2) show_img_with_matplotlib(cv2.cvtColor(thresh3, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 220", 3) show_img_with_matplotlib(cv2.cvtColor(thresh4, cv2.COLOR_GRAY2BGR), "THRESH_BINARY_INV - thresh = 100", 4) # 其他圖像可視化方法類似,不再贅述 # ...
如上圖所示,maxval
參數僅在使用 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
閾值類型時有效,上例中將 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
類型的 maxval
值設置為 255
及 220
,以便查看閾值圖像在這兩種情況下的變化情況。
了解 cv2.threshold()
不同參數的工作原理后,我們將 cv2.threshold()
應用于真實圖像,并使用不同的閾值:
# 加載圖像 image = cv2.imread('example.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 繪制灰度圖像 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img", 1) # 使用不同的閾值調用 cv2.threshold() 并進行可視化 for i in range(8): ret, thresh = cv2.threshold(gray_image, 130 + i * 10, 255, cv2.THRESH_BINARY) show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(130 + i * 10), i + 2)
看完了這篇文章,相信你對“Python OpenCV閾值處理的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。