圖像閾值化
圖像的二值化或閾值化(Binarization)旨在提取圖像中的目標(biāo)物體,將背景以及噪聲區(qū)分開來私植。通常會設(shè)定一個閾值T巫俺,通過T將圖像的像素劃分為兩類:大于T的像素群和小于T的像素群。
灰度轉(zhuǎn)換處理后的圖像中,每個像素都只有一個灰度值味廊,其大小表示明暗程度。二值化處理可以將圖像中的像素劃分為兩類顏色
?
?
圖像閾值化處理操作,包括二進(jìn)制閾值化余佛、反二進(jìn)制閾值化柠新、截?cái)嚅撝祷⒎撮撝祷癁?辉巡、閾值化為0
?
retval, dst = cv2.threshold(src, thresh, maxval, type)
- src:表示的是圖片源
- thresh:表示的是閾值(起始值)
- maxval:表示的是最大值
- type:表示的是這里劃分時使用的算法,常用值為0(cv2.THRESH_BINARY)
?- 二進(jìn)制閾值化(cv2.THRESH_BINARY):大于等于閾值的像素點(diǎn)的灰度值設(shè)定為最大值,灰度值小于閾值的像素點(diǎn)的灰度值設(shè)定為0
- 反二進(jìn)制閾值化(cv2.THRESH_BINARY_INV):大于閾值的像素點(diǎn)的灰度值設(shè)定為0,小于該閾值的灰度值設(shè)定為255
- 截?cái)嚅撝祷?cv2.THRESH_TRUNC):大于等于閾值的像素點(diǎn)的灰度值設(shè)定為該閾值,小于該閾值的灰度值不改變
- 反閾值化為0(cv2.THRESH_TOZERO_INV):大于等于閾值的像素點(diǎn)變?yōu)?,小于該閾值的像素點(diǎn)值保持不變
- 閾值化為0(cv2.THRESH_TOZERO):大于等于閾值的像素點(diǎn)恨憎,值保持不變,小于該閾值的像素點(diǎn)值設(shè)置為0
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 10))
#讀取圖像
img = cv2.imread('data/test1.jpg')
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#閾值化處理
#二進(jìn)制閾值化
ret, thresh1 = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)
#反二進(jìn)制閾值化
ret, thresh2 = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
#截?cái)嚅撝祷?ret, thresh3 = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TRUNC)
#閾值化為0
ret, thresh4 = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO)
#反閾值化為0
ret, thresh5 = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)
#顯示結(jié)果
titles = [
'Gray Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'
]
images = [GrayImage, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
image.png