图像的二值化(需要是灰度图像)
import cv2 as cv
import numpy as np
def threshold_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#cv.THRESH_TRIANGLE与cv.THRESH_OTSU是自动寻找阈值,这个时候threshold值必须是0
#如果threshold不为0,即是自己指定的(如127),那么type就直接THRESH_BINARY就够了
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print(ret)
cv.imshow("binary",binary)
def local_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
binary =cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
cv.imshow("binary1", binary)
src =cv.imread("E:/opencv/picture/dog.jpg")
cv.imshow("initial_window",src)
threshold_demo(src)
local_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
分析:
1. 全局阈值
def threshold_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#cv.THRESH_TRIANGLE与cv.THRESH_OTSU是自动寻找阈值,这个时候threshold值必须是0
#如果threshold不为0,即是自己指定的(如127),那么type就直接THRESH_BINARY就够了
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print(ret)
cv.imshow("binary",binary)
threshold其函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst
src参数表示输入图像(多通道,8位或32位浮点)。
thresh参数表示阈值。(如果type是自动二值化就设置为0)
maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。
type参数表示阈值类型。
retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
dst参数表示输出与src相同大小和类型以及相同通道数的图像。
type阈值类型说明
cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用
cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
cv.THRESH_BINARY)# 自定义阈值为127,大于127的是白色 小于的是黑色
cv.THRESH_BINARY_INV)# 自定义阈值为127,大于127的是黑色 小于的是白色
cv.THRESH_TRUNC)# 截断 大于127的是改为127 小于127的保留
cv.THRESH_TOZERO)# 截断 小于127的是改为127 大于127的保留
2. 局部阈值法
3. def local_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
binary =cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
cv.imshow("binary1", binary)
adaptiveThreshold函数进行局部阈值
函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
src参数表示输入图像(8位单通道图像)。
maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod参数表示自适应阈值算法,
平均— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
高斯—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
blockSize参数表示块大小,规定领域大小(奇数且大于1,比如3,5,7........ )。
C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。
二.对超大图像进行二值化
如果这个时候只是单纯的用二值化api,图像上会出现很多噪声,所以我们特地介绍了一种对大图像进行二值化的方法import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#对超大图像进行二值化
def big_image_threshold(image):
cw = 256
ch = 256
h,w = image.shape[:2]
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
for row in range(0, h, ch):
for col in range(0, w, cw):
#gray[0:3] 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
roi = gray[row:row+ch,col:col+ch]#表示从[row,col]到[row+ch,col+ch]的所有元素所组成的矩阵
#推荐使用局部阈值二值化
dst = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20)
gray[row:row+ch,col:col+ch] =dst
cv.imwrite("E:/opencv/picture/bigpicture1.jpg",gray)
src = cv.imread("E:/opencv/picture/bigpicture.jpg")
t1 = cv.getTickCount()
big_image_threshold(src)
t2 = cv.getTickCount()
time= (t2-t1)/cv.getTickFrequency()
#print("time =%sms\n"%(time)*1000)
cv.waitKey(0)
cv.destroyAllWindows()