###### 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 的反轉


```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(最亮)
```

```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(最暗)
```

```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,其餘不變
```

```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()
```
