Opencv入门系列五

Opencv入门系列五


主要内容:

  • 阈值处理
  • 自适应阈值
  • Otsu处理

1. 阈值处理

阈值处理:通过设定一个阈值,将图像进行二值化处理

Opencv中有cv2.threshold()和cv2.adaptiveThreshold()实现阈值处理。

1.1 cv2.threshold()

cv2.threshold()是阈值处理的一个函数,其语法格式如下:

image-20210201223229067

● retval:返回的阈值。

● dst:阈值分割结果图像,与原始图像具有相同的大小和类型。

● src:要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值。

● thresh:要设定的阈值。

● maxval:当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值。

● type:阈值分割的类型。

阈值分割类型如下:

image-20210201213959563

①BINARY:二值化数据,像素只有0和maxval两个值。

②TRUNC:二值化数据,像素只有0和thresh(设定的阈值)两个值。

③TOZEO:剔除阈值之外的数据(归零),可选是大于或小于阈值部分。

④MASK:掩码。

⑤OTSU和TRIANGLE:用于不同的算法之中。

下面是一个简单运用阈值函数的例子:

import cv2
import numpy as np

Lena = cv2.imread("Resources/lena.png",1)
cv2.imshow("lena",Lena)
Throld = 50
s,ThresholdLena = cv2.threshold(Lena,Throld,255,cv2.THRESH_BINARY)

if s==Throld:
    cv2.imshow("ThresholdImg",ThresholdLena)
cv2.waitKey(0)

1.2 cv2.adaptiveThreshold()

在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。cv2.adaptiveThreshold()函数实现自适应阈值处理,其语法如下:

image-20210201215939076

● dst:自适应阈值处理结果。

● src:要进行处理的原始图像。需要注意的是,该图像必须是8位单通道的图像。

● maxValue:最大值。

● adaptiveMethod:自适应方法。自适应阈值等于每个像素由参数blockSize所指定邻域的加权平均值减去常量C

cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重值是一致的。

cv2.ADAPTIVE_THRESH_`GAUSSIAN`_C:与邻域各个像素点到中心点的距离有关,通过`高斯方程`得到各个点的权重值。

● thresholdType:阈值处理方式,该值必须是cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。

● blockSize:块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。

● C是常量。

import cv2
import numpy as np

Lena = cv2.imread("Resources/lena.png",0)
# Lena = cv2.imread("Resources/lena.png",1) 自适应阈值处理不可以使用类型1
cv2.imshow("lena",Lena)
Throld = 100
s,ThresholdLena = cv2.threshold(Lena,Throld,255,cv2.THRESH_BINARY)
MeanLena = cv2.adaptiveThreshold(Lena,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)

GuessLena = cv2.adaptiveThreshold(Lena,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C   ,cv2.THRESH_BINARY,5,3)

cv2.imshow("MeanLena",MeanLena)
cv2.imshow("GuessLena",GuessLena)
if s==Throld:
    cv2.imshow("ThresholdImg",ThresholdLena)
cv2.waitKey(0)

image-20210201221626640

2.Otsu处理

Otsu方法能够根据当前图像给出最佳的类间分割阈值。Otsu方法会遍历所有可能阈值,从而找到最佳的阈值。通过在函数cv2.threshold()中对参数type的类型多传递一个参数“cv2.THRESH_OTSU”,即可实现Otsu方式的阈值分割。在使用Otsu方法时,要把阈值设为0,函数会返回最佳阈值。如下所示

image-20210201222016802

import cv2
import numpy as np

Lena = cv2.imread("Resources/lena.png",0)
# Lena = cv2.imread("Resources/lena.png",1) 自适应阈值处理不可以使用类型1
cv2.imshow("lena",Lena)
Throld = 100
s,ThresholdLena = cv2.threshold(Lena,Throld,255,cv2.THRESH_BINARY)
MeanLena = cv2.adaptiveThreshold(Lena,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
GuessLena = cv2.adaptiveThreshold(Lena,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C ,cv2.THRESH_BINARY,5,3)
Thresholds,QtsuLena = cv2.threshold(Lena,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

print("Thresholds = ",Thresholds)
cv2.imshow("MeanLena",MeanLena)
cv2.imshow("GuessLena",GuessLena)
cv2.imshow("QtsuLena",QtsuLena)
if s==Throld:
    cv2.imshow("ThresholdImg",ThresholdLena)
cv2.waitKey(0)

image-20210201222319818

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值