阈值处理

2021-10-12  本文已影响0人  Tsukinousag

阈值处理是指剔除图像内像素高于一定值或者低于一定值的像素点

返回阈值,dst=cv2.threshold(src,thresh,maxvel,type)

二值化阈值处理(cv2.THRESH_BINARY)

会将原始图像处理为仅有两个值的二值图像

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)

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)

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)

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)

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)

cv2.ADAPTIVE_THRESH_MEAN_C

邻域所有像素点的权重值是一致的

cv2.ADAPTIVE_THRESH_GAUSSIAN_C

与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值

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()
上一篇下一篇

猜你喜欢

热点阅读