阈值分割

主要讨论阈值分割问题。

目标

  • 了解并会使用固定阈值、自适应阈值和Otsu阈值法"二值化"图像

  • 学习OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()

import cv2  
import matplotlib.pyplot as plt 
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required =True, help="Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"],0)
# img=cv2.imread('gradient.jpg',0)
ret,th=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
cv2.imshow('thres',th)
cv2.waitKey(0)
#cv2.threshold(src_gray,dst,threshold_value,max_BINARY,threshold_type)
#Src_gray:输入的灰度图像地址
#dst 输出图像的地址
#threshold_value 进行阈值操作时阈值的大小
#max_BINARY_value 设定的最大灰度值
#threshold_type 阈值的类型
ret,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
ret,th2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)

ret,th3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)

ret,th4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)

ret,th5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)


titles=['Original','BINARY','BINARY_INV','TRUNC','TOZERO','TO_ZERO_INV']
images=[img,th1,th2,th3,th4,th5]

for i in range(6):
    plt.subplot(2,3,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i],fontsize=8)
    plt.xticks([])
    plt.yticks([])
plt.show()



#cv2.adaptiveTreshold(image,max_BINARY,Adaptive_Method,threshold_type,Block_Size,C)
#max_BINARY_value 设定最大灰度值
#threshold_type 阈值的类型
#adaptive method 制定计算阈值的方法

#block_size 领域的大小
#c 常熟,阈值就等于的平均值或者平均值减去这个常数
#这个值是一个从平均值中减去的整数,使得我们可以微调我们的阈值
# img=cv2.imread('sudoku.jpg',0)
ret,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
th2=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,4)
th3=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,17,6)
titles=['Original','Global(v=127','Adaptive Mean','Adaptive_Gaussian']
images=[img,th1,th2,th3]
for i in range(4):
    plt.subplot(2,2,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i],fontsize=8)
    plt.xticks([])
    plt.yticks([])
plt.show()

#Otsu
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.subplot(131), plt.imshow(image, "gray")
plt.title("source image"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.hist(image.ravel(), 256)
plt.title("Histogram"), plt.xticks([]), plt.yticks([])
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)  #方法选择为THRESH_OTSU
plt.subplot(133), plt.imshow(th1, "gray")
plt.title("OTSU,threshold is " + str(ret1)), plt.xticks([]), plt.yticks([])
plt.show()

 

注意:这里的ret值是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值