python-图像阈值操作

一、简单阈值处理

"""
简单阈值
    对于每个像素应用相同的阈值,如果像素值小于阈值,将其设置为0,否则将其设置为最大值
    方法:cv2.threshold(img,thresh,maxval,type)
    格式:retval,dst=cv2.threshold(img,thresh,maxval,type)
           retval:返回的阈值
           dst:阈值分割结果图像,与原始图像有相同的大小和类型
           img:要分割的图像,可以是多通道的,8位或32位浮点数
           thresh:阈值
           maxval:当type为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定最大值
           type:阈值分割的类型
                    cv2.THRESH_BINARY
                    cv2.THRESH_BINARY_INV
                    cv2.THRESH_TRUNC
                    cv2.THRESH_TOZERO
                    cv2.THRESH_TOZERO_INV
 """
 # 简单阈值
# 1.导入需要的模块
import cv2
import matplotlib.pyplot as plt
# 2.读入图片
img = cv2.imread('img_2.png',0)  # 0代表灰度图片
ingRGB= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow('imgBGR',ingRGB)
cv2.waitKey(0)
cv2.destroyAllWindows()

ret,thresh1 = cv2.threshold(img,100,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,100,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,100,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,100,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,100,255,cv2.THRESH_TOZERO_INV)
titles=["img","binary","binary_inv","trunc","tozero","tozero_inv"]
imgs =[img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1)
    plt.title(titles[i])
    plt.imshow(imgs[i],'gray')
plt.show()

在这里插入图片描述
在这里插入图片描述

二、自适应阈值

"""自适应阈值:
     对于色彩均衡的图像,使用一个阈值即可,对于色彩不均衡的情况下,使用自适应阈值,算法根据像素周围小区域来确定像素的阈值
     方法:cv2.adaptiveThreshold(img,maxval,adaptiveMethod,thresholdType,blockSize,C)
     格式:dst=cv2.adaptiveThreshold(img,maxval,adaptiveMethod,thresholdType,blockSize,C)
          dst:自适应阈值处理
          img:要进行处理的原始图片,必须是八位单通道图像
          maxVal:最大值
          adaptiveMethod:表示自适应方法
                         cv2.ADAPTIVE_THRESH_MEAN_C:所有像素点权重一致
                         cv2.ADAPTIVE_THRESH_GAUSSIAN_C:权重与邻域各个像素点到中心的距离有关
          thresholdType:代表阈值处理方式,可以是cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV
          blockSize:代表块大小,表示一个像素在计算阈值时所使用的邻域尺寸,通常为3,5,7等
          C是常量:在blockSize指定的区域内,加权平均值减去常量C
  """
  # 自适应阈值
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('img_2.png',0)  # 0代表灰度图片
ingRGB= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow('imgBGR',ingRGB)
cv2.waitKey(0)
cv2.destroyAllWindows()

ret,thresh1=cv2.threshold(img,100,255,cv2.THRESH_BINARY)
thresh2 =cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)  # 选中区域所有点权重相同
thresh3 =cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)  # 离中心点越近,权重越高,反之越低
imgs =[img,thresh1,thresh2,thresh3]
for i in range(4):
    plt.subplot(2,3,i+1)
    plt.imshow(imgs[i],'gray')
plt.show()

在这里插入图片描述
在这里插入图片描述

三、Otsu阈值

"""
Otsu阈值:当阈值无法人工确定的时候,可以使用Otsu的方法通过计算确定阈值
"""
# Otsu阈值
# 导入模块
import cv2
import numpy as np
# 读取图像
img = cv2.imread('img_2.png',0)
# 统计点的个数
hist = cv2.calcHist([img],[0],None,[256],[0,256])
# ni/N=pi ni表示像素点出现的次数,N表示总次数,pi表示概率
hist_norm = hist.ravel()/hist.max()
# m=pi之和
m =hist_norm.cumsum()
# 相当于i
bins = np.arange(256)
# 方差的初始值,设为极大值
inf = np.inf # 极大值
# 阈值初始值设为-1
thresh = -1
for i in range(1,256):
    p1,p2 = np.hsplit(hist_norm,[i])
    q1,q2 = m[i],m[255]-m[i]
    b1,b2 = np.hsplit(bins,[i])
    # 求均值与方差
    m1, m2 = np.sum(p1 * b1) / q1, np.sum(p2 * b2) / q2
    v1,v2 = np.sum(((b1-m1)**2)*p1)/q1, np.sum(((b2-m2)**2)*p2)/q2,
    fn = v1*q1+v2*q2
    if fn<inf:
        inf = fn
        thresh = i
# 使用Opecv函数找到Ostu阈值
ret,ostu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print("{}{}".format(thresh,ret))  # 122121.0



  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值