OpenCV+Python图像二值化

全局二值化

全局设定一个阈值,整个图像中大于这个值的像素设定成一个指定值(max_val_to_set),否则设为0。

# src_img必须是灰度图像
ret, result_img = cv2.threshold(src_img, threshold, max_val_to_set, threshold_type)
# threshold_type 常用的有三种
# THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC
# 返回的ret是Otsu's算法计算出的最佳阈值。
# 返回的图像为uint8

自适应二值化

当图像受到光照影响的时候,由于明暗的关系,全局的阈值效果就很差了。这时候需要每个局部区域都有自己的阈值。

cv2.adaptiveThreshold(src_img, max_val_to_set, adaptive_method, threshold_type, block_size, C)
# adpative_method 有两种:
# cv2.ADAPTIVE_THRESH_MEAN_C 阈值是局部区域的灰度均值
# cv2.ADAPTIVE_THRESH_GAUSSIAN_C 阈值是局部区域内各灰度值根据高斯窗口比重相加的总和
# C是一个常量,用来被计算出的阈值减去

Otsu’s二值化

该算法用于灰度直方图具有明显两个峰值的图像,算法自动计算出存在于两个峰值之间的阈值。

ret, result_img = cv2.threshold(src_img, 0, 255, cv2.THRESH_OTSU)

实例

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('laugh.jpg', cv2.IMREAD_GRAYSCALE)
_, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
_, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# 灰度渐变
_, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
thresh4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0)
thresh5 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 91, 0)
thresh6 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 0)
thresh7 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 91, 0)
ret, thresh8 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'adaptive_mean_5', 'adaptive_mean_91',
          'adaptive_gaussian_5', 'adaptive_gaussian_91', 'OTSU']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5, thresh6, thresh7, thresh8]

for i in range(9):
    plt.subplot(3, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

plt.show()
效果图
OpenCV+Python图像二值化_第1张图片
不同二值化参数的效果图

你可能感兴趣的:(OpenCV+Python图像二值化)