OpenCV学习笔记-图像二值化
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
图像二值化的类型有以下几种:
0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
理论公式:
图像二值化有全局调整、局部自适应和手动计算阈值。
具体代码:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#全局二值化
def threshold_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_TRIANGLE)
''' ret: 计算出来的阈值
binary: 返回的二值图像
cv.THRESH_BINARY |cv.THRESH_OTSU: THRESH_BINARY是将灰度图二值化,THRESH_OTSU是二值化的计算算法
计算的方法有很多,一般使用OTSU '''
print('threshold value %s :' % (ret))
cv.imshow('binary', binary)
#局部自适应
def local_threshold(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
''' adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
adaptiveMethod: 有两种method ADAPTIVE_THRESH_GAUSSIAN_C和ADAPTIVE_THRESH_MEAN_C,
个人感觉高斯更好,可以在实际应用中互换试试
thresholdType: 二值化的方式
blockSize: 最好是奇数,可以防止一些坑
C: 偏置值 像素值大于adaptiveMethod的值+10 才会重置为255 '''
cv.imshow('GAUSSIAN-binary', binary)
#手动计算阈值
def custom_threshold(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
h, w = gray.shape[:2]
m = np.resize(gray, [1, w*h])
mean = m.sum() / (w*h)
print('mean : ', mean)
ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
cv.imshow('binary', binary)
img = cv.imread('img/text1.png')
cv.namedWindow('img',cv.WINDOW_AUTOSIZE)
cv.imshow('img',img)
local_threshold(img)
cv.waitKey(0)
cv.destroyAllWindows()
局部自适应的效果图:
参考文章:
https://www.jianshu.com/p/6efd324e8677
http://blog.sina.com.cn/s/blog_154bd48ae0102wboc.html