###### tags: `OpenCV`,`threshold`,`閾值` # OpenCV 基礎篇-閾值(binary thresholding) **二元影像-Binary Images** * 灰階影像只有一層,但是每個pixel還是有256種值。 * 如果每個pixel,可以只有0和1,那就是二元影像。 * 圖像的閾值化旨在提取圖像中的目標物體,將背景以及噪聲區分開來。 * 通常會設定一個閾值T,通過T將圖像的像素分為兩類: 大於T的像素群和小於T的像素群。 **cv2.threshold(src, thresh, maxval, type, dst=None)** 第一個參數src 指原圖像,原圖像應該是灰度圖,只能輸入單通道圖像 第二個參數thresh 指用來對像素值進行分類的閾值(就是門檻值) 第三個參數maxval 指當像素值高於(有時是小於,根據type 來決定)閾值時應該被賦予的新的像素值,在二元閾值THRESH_BINARY和逆二元閾值THRESH_BINARY_INV中使用的最大值 第四個參數type 指根據閾值,不同的判定方法,這些方法包括以下五種類型:     cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取 0(比較常用)     cv2.THRESH_BINARY_INV THRESH_BINARY 的反轉     cv2.THRESH_TRUNC 大於閾值部分設為閾值,否則不變     cv2.THRESH_TOZERO 大於閾值部分不改變,否則設為零     cv2.THRESH_TOZERO_INV THRESH_TOZERO 的反轉 ![](https://i.imgur.com/1a3vryh.jpg) ![](https://i.imgur.com/PVpN2Du.jpg) ```python= #THRESH_BINARY import cv2 import numpy as np img=np.random.randint(0,256,size=[4,5],dtype=np.uint8) t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY) print("img=\n",img) print("t=",t) print("rst=\n",rst)#大於127的變255(最亮) ``` ![](https://i.imgur.com/2lOY9KZ.jpg) ```python= #THRESH_BINARY_INV import cv2 import numpy as np img=np.random.randint(0,256,size=[4,5],dtype=np.uint8) t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) print("img=\n",img) print("t=",t) print("rst=\n",rst)#大於127的變0(最暗) ``` ![](https://i.imgur.com/K4oNFBL.jpg) ```python= #THRESH_TRUNC import cv2 import numpy as np img=np.random.randint(0,256,size=[4,5],dtype=np.uint8) t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) print("img=\n",img) print("t=",t) print("rst=\n",rst) #大於127的就變成127,其餘不變 ``` ![](https://i.imgur.com/AQLeU0l.jpg) ```python= import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('sheep.jpg') img_resize = cv2.resize(img, (0,0), fx=0.5, fy=0.5) #原尺寸過大 調整一下尺寸 img2= cv2.cvtColor(img_resize, cv2.COLOR_BGR2RGB) grayimage = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY) ret, thresh1 = cv2.threshold(grayimage, 127, 255, cv2.THRESH_BINARY) ret, thresh2 = cv2.threshold(grayimage, 127, 255, cv2.THRESH_BINARY_INV) ret, thresh3 = cv2.threshold(grayimage, 127, 255, cv2.THRESH_TRUNC) #超過閾值的都會被歸為一類 ret, thresh4 = cv2.threshold(grayimage, 127, 255, cv2.THRESH_TOZERO) ret, thresh5 = cv2.threshold(grayimage, 127, 255, cv2.THRESH_TOZERO_INV) #標題 titles = ['Origin Image', 'gray', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] #對應的圖 images = [img2, grayimage, thresh1, thresh2, thresh3, thresh4, thresh5] plt.rcParams['figure.figsize'] = [200, 100] plt.rcParams['font.size'] = 150 for i in range(7): # 畫7次 plt.subplot(2, 4, i + 1) plt.imshow(images[i], cmap='gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show() ``` ![](https://i.imgur.com/alGbM2u.jpg)