阈值处理是指剔除图像内像素高于一定值或者低于一定值的像素点
返回阈值,dst=cv2.threshold(src,thresh,maxvel,type)
二值化阈值处理(cv2.THRESH_BINARY)
会将原始图像处理为仅有两个值的二值图像
- 对于灰度值>thresh的像素点,灰度值设置为maxvel
- 对于灰度值<=thresh的像素点,灰度值设置为0
import cv2
img=cv2.imread("D:/renlian.jpg")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyWindow()
反二值化阈值处理(cv2.THRESH_BINARY_INV)
- 对于灰度值>thresh的像素点,灰度值设置为0
- 对于灰度值<=thresh的像素点,灰度值设置为maxvel
import cv2
img=cv2.imread("D:/renlian.jpg")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyWindow()
截断阈值处理(CV2.THRESH_TRUNC)
- 大于thresh的像素点的值设定为阈值
- 小于等于thresh的像素点的值保持不变
import cv2
img=cv2.imread("D:/renlian.jpg")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyWindow()
超阈值零处理(cv2.THRESH_TOZERO_INV)
- 大于阈值的像素点的值处理为0
- 小于等于该阈值的像素点的值保持不变
import cv2
img=cv2.imread("D:/renlian.jpg")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyWindow()
低阈值0处理(cv2.THRESH_TOZERO)
- 大于阈值的像素点的值保持不限
- 小于等于该阈值的像素点处理为0
import cv2
img=cv2.imread("D:/renlian.jpg")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyWindow()
自适应阈值处理
使用自动变换的阈值完成对图像的阈值处理
dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
- 8位单通道图像
- 最大值
- 自适应方法
cv2.ADAPTIVE_THRESH_MEAN_C
邻域所有像素点的权重值是一致的
cv2.ADAPTIVE_THRESH_GAUSSIAN_C
与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值
- cv2.THRESH_BINARY / cv2.THRESH_BINARY_INV
- 3,5,7
- 常量
import cv2
img=cv2.imread("D:/hjb.jpg",0)
#二值化阈值处理
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#两个自适应阈值处理的效果
thdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
thdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow("img",img)
cv2.imshow("thd",thd)
cv2.imshow("thdMEAN",thdMEAN)
cv2.imshow("thdGAUS",thdGAUS)
cv2.waitKey(0)
cv2.destroyWindow()
可以看出,普通的阈值处理会丢失大量的信息,而自适应阈值处理可以得到效果更好的二值图像
Otsu处理
遍历所有可能的阈值,从而找到最佳的阈值
cv2.threshold()中对参数type+cv2.THRESH_OTSU
在使用Otsu方法时,要把阈值设为0
import cv2
import numpy as np
img=np.zeros((5,5),dtype=np.uint8)
img[0:5,0:5]=123
img[2:5,2:5]=126
print(img)
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(thd)
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print(t2,otsu)
[[123 123 123 123 123]
[123 123 123 123 123]
[123 123 126 126 126]
[123 123 126 126 126]
[123 123 126 126 126]]
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
123.0
[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 255 255 255]
[ 0 0 255 255 255]
[ 0 0 255 255 255]]
import cv2
img=cv2.imread("D:/hjb.jpg",0)
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("img",img)
cv2.imshow("thd",thd)
cv2.imshow("otsu",otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
网友评论