图像阈值
- 7.1 简单阈值
- 7.2 自适应阈值
7.1 简单阈值
cv2.threshold(src, thresh, maxval, type, dst=None)
图像阈值
- src:源图像,应该为灰度图。
- thresh:阈值,像素值小于阈值,则将其设置为0,否则将其设置为最大值。
- maxval:分配给超过阈值的像素值的最大值。
- type:提供了不同类型的阈值
- cv.THRESH_BINARY
- cv.THRESH_BINARY_INV
- cv.THRESH_TRUNC
- cv.THRESH_TOZERO
- cv.THRESH_TOZERO_INV
- dst:输出图像
该方法返回两个输出。第一个是使用的阈值,第二个输出是阈值后的图像。
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像(灰度图)
img = cv2.imread('gradient.png', 0)
# 阈值,返回的图像
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, 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()
7.2 自适应阈值
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
自适应阈值化
- src:源图像
- maxValue:超过阈值的部分取值是多少
- adaptiveMethod:在一个邻域内计算阈值所采用的算法
- ADAPTIVE_THRESH_MEAN_C:领域的平均值
- ADAPTIVE_THRESH_GAUSSIAN_C:领域的高斯均值
- thresholdType:这是阈值类型
- THRESH_BINARY
- THRESH_BINARY_INV
- blockSize:计算单位是像素的邻域块大小选择,这是局部邻域大小,3、5、7等
- C:偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。
返回输出是阈值后的图像
import cv2
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 简单阈值
# threshold(src, thresh, maxval, type, dst=None)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值
# adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
thresh3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 2)
titles = ['Original Image', 'BINARY', 'ADAPTIVE_THRESH_MEAN_C', 'ADAPTIVE_THRESH_GAUSSIAN_C']
images = [img, thresh1, thresh2, thresh3]
for i in range(4):
plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()