算法思想:局部二值化
全局二值化容易受阴影影响,所以可用局部二值化。自适应阈值分割的本质就是局部二值化。
步骤:
1. 某个像素值,原来是s,取其周围的n*n的区域,求该区域均值或高斯权值,记为T;
2. 如果S>T,则该像素点二值化为255,否则为0
优化:
1.在实际操作中,均值模糊或者高斯模糊,实现求区域均值或高斯均值
2. 在以上步骤中,增加参数C,C可以为任意实数,当S>T-C时,把原像素二值化为255.
3.也可以设置超参数a, 0<=a<=1,当S>(1-a)*T时,把原像素点二值化为255,通常取a=0.15
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def showImage(name,img):
plt.imshow(img,cmap="gray")
plt.title(name)
plt.show()
def AdaptiveThreshold(img):
C=6
win=21
img_blur=cv.blur(img,(win,win))
img2=np.uint8(img>img_blur-C)*255
return img2
def AdaptiveThreshold2(img):
alpha=0.05
win=21
img_blur=cv.GaussianBlur(img,(win,win),5)
img2=np.uint8(img>(1-alpha)*img_blur)*255
return img2
if __name__=="__main__":
img=cv.imread("../image/goldpig.jpg",0)
img2=AdaptiveThreshold(img)
img3=AdaptiveThreshold2(img)
showImage("img", img)
showImage("img2",img2)
showImage("img3", img3)