山东大学暑期实训(十一)
记录图像二值化,阈值处理,参考- link
1.全局阈值实例
import cv2 as cv
import numpy as np
# 全局阈值
def threshold_image(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("初始图像:", gray)
# 大律法,全局自适应阈值 参数0可改为任意数字但不起作用
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
print("yuzhi:%s" % ret)
cv.imshow("OTSU", binary)
# TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
print("yuzhi:%s" % ret)
cv.imshow("TRIANGLE", binary)
# 自定义阈值为150,大于150的是白色 小于的是黑色
ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)
print("yuzhi:%s" % ret)
cv.imshow("define_yuzhi", binary)
# 自定义阈值为150,大于150的是黑色 小于的是白色
ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)
print("yuzhi:%s" % ret)
cv.imshow("define_rev", binary)
# 截断 大于150的是改为150 小于150的保留
ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)
print("yuzhi:%s" % ret)
cv.imshow("jieduan1", binary)
# 截断 小于150的是改为150 大于150的保留
ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)
print("yuzhi:%s" % ret)
cv.imshow("jieduan2", binary)
src = cv.imread("initial.jpg")
threshold_image(src)
cv.waitKey(0)
cv.destroyAllWindows()
2.局部阈值实例
- 用到的主要函数
adaptiveThreshold( src,
maxValue,
adaptiveMethod,
thresholdType,
blockSize,
C,
dst=None)
-
参数的含义
第一个src:原始图像
第二个maxValue:像素值上限
第三个自适应方法adaptiveMethod:
— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权重为一个高斯窗口
第四个值的赋值方法:
只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
第五个blockSize
规定领域大小(一个正方形的领域)
第六个常数C,
阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值 -
演示代码
import cv2 as cv
import numpy as np
#局部阈值
def local_yuzhi(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# ADAPTIVE_THRESH_MEAN_C 领域内均值
binary1=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
cv.imshow('local1',binary1)
# ADAPTIVE_THRESH_GAUSSIAN_C 领域内像素点加权和,权重为一个高斯窗口
binary2=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
cv.imshow('local2',binary2)
src = cv.imread("initial.jpg")
local_yuzhi(src)
cv.waitKey(0)
cv.destroyAllWindows()