import matplotlib.pyplot as plt
import cv2
# 灰度图读入
img = cv2.imread('gradient.png', 0)
# 应用5种不同的阈值方法
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]
# 使用Matplotlib显示
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴
plt.show()
THRESH_BINARY 二进制阈值化
THRESH_BINARY_INV 反二进制阈值化
THRESH_TRUNC 截断阈值化
THRESH_TOZERO 阈值化为0
THRESH_TOZERO_INV 反阈值化为0
二进制阈值化
首先指定一个阈值量即像素的灰度值,遍历图像中像素值,大于这个阈值的像素均设置为最大像素值(如8位灰度值最大为255),灰度值小于设定阈值的像素点像素值重新赋值为0.
反二进制阈值化
与二进制阈值化相同的是也要首先指定一个阈值,不同的是在对图像进行阈值化操作时正好与二进制阈值化相反,当图像像素点超过这个阈值的时候像素点重新赋值为0,当像素值低于该阈值时即赋值为最大值
截断阈值化
根据给定的像素值阈值,图像中大于该阈值的像素点被重新设置为该阈值,而小于该阈值的像素值保持不变
阈值化为0
与截断阈值化不同,阈值化为0类型像素点的灰度值如果大于该阈值则像素值不变,如果像素点的灰度值小于该阈值,则像素值设置为0.
反阈值化为0
其原理类似于阈值化为0类型只不过在对图像进行操作时相反,像素值大于该阈值的像素重新赋值为0,而小于该阈值的像素值则保持不变
在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:
import matplotlib.pyplot as plt
import cv2
# 灰度图读入
img = cv2.imread('timg.jpg', 0)
# 固定阈值
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 17, 6)
titles = ['Original', 'Global(v = 127)', 'Adaptive Mean', 'Adaptive Gaussian']
images = [img, th1, th2, th3]
for i in range(4):
plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([])
plt.show()
OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。
前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度
背景:用n2, sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度