Otsu’s 二值化(大津算法)
二值化是什么?有什么用?
PDF扫描成电子版,文字识别,车牌识别等等图像处理场合均需要使用“二值化”操作。我们知道图像是一个矩阵组成,矩阵的元素是一个数字,这个数字是当前像素点对应的颜色(即像素值)。而图片的二值化操作就是将所有像素值变成要么是0要么是1.一般二值化怎么做的呢?答:“设置一个数字d,只要像素值大于这个阈值d那就设置为1,小于这个阈值d那就设置为0。当然也可以大于这个阈值设置为0,小于设置为1”。但是这个阈值怎么找到的呢?计算出一个合适的阈值出来这就是 Otsu’s 二值化(大津算法)要做的事情。
下面是一幅图片对应的像素值矩阵(图片就是矩阵):
[200,30,4013,40,45]\begin{bmatrix}
200,30,40\\
13, 40,45
\end{bmatrix}[200,30,4013,40,45]
假设现在我通过Otsu’s 二值化(大津算法)计算出上面那个图片二值化的最优阈值是39.
那么上面那个图片就会被二值化为:
[1,0,10,1,1]\begin{bmatrix}
1,0,1\\
0, 1,1
\end{bmatrix}[1,0,10,1,1]
下面我们实验下。
实验1. 造一个数据
做图像处理必备技能就是人工制造一个纯净的图片检验算法正确性
import numpy as np
import cv2
import matplotlib.pyplot as plt
######我们先制造一个200x200的图片用于二值化实验#######
def get_test_img():
img_mat = np.zeros((200,200),dtype=np.uint8)# 记得设置成整数,不然opencv会将大于1的浮点数全显示成白色
for row in range(200):
for col in range(200):
img_mat[row][col] = col
return img_mat
img_mat = get_test_img()
plt.imshow(img_mat,cmap='gray')# 显示图片
plt.xlabel("raw img")
如下所示: