OpenCv 阈值分割

OpenCv
阈值分割
通俗理解为,设立一个阈值(其实就是分界线)将一张图分成两半。

import cv2
#引入cv2

img = cv2.imread('huidutu.jpg', 0)
#读取灰度图

ret, th = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 阈值分割

cv2.imshow('thresh', th)
#显示图片

cv2.waitKey(0)

threshold()用于实现阈值分割,ret是return value缩写,代表当前的阈值。

关于函数的参数:

官方文档参数如下
在这里插入图片描述
src:要处理的原图,一般为灰度图
thresh:阈值
maxval:最大阈值一般为255
type:阈值方式,最主要有五种

import matplotlib.pyplot as plt

# 应用5种不同的阈值方法
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
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', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]

# 使用Matplotlib显示
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()

5种不同的阈值方式结果
#图和代码,是我抄的
关于这几种阈值方式,官方文档给出这样一个东西:
在这里插入图片描述
THRESH_BINARY:如果这个像素点的值大于阈值则将该像素点变成你设置的maxval,其他的变成0,其他方式类比这个理解

但是对于明暗分布不均的图片,threshold()并不适用,这就引入adaptiveThreshold()。
他每次回选取图片的一小部分进行计算阈值,每一块区域的阈值都不相同。

官方给的参数如下:
在这里插入图片描述
观察和threshold()相比多了adaptiveMethod、blockSize、C参数

adaptiveMethod:一块小区域的计算阈值的方式

  • ADAPTIVE_THRESH_MEAN_C:小区域内取均值
  • ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核

blockSize:顾名思义就是小区域的面积,比如传入10,则小面积块为10*10

C:最后的结果再减去这个值

# 自适应阈值对比固定阈值
img = cv2.imread('yizhangtu.jpg', 0)

# 固定阈值
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值
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()

自适应阈值对比固定阈值
#同样代码和图是我抄的

总结一下:

cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV阈值分割是一种图像处理技术,可以将图像转换为二值图像,以便更好地进行图像分析和处理。在使用OpenCV进行阈值分割时,可以使用不同的方法来确定阈值。根据引用和引用的代码,可以看出使用了cvLoadImage函数加载图像,并将其转换为灰度图像。接着使用cvCreateImage函数创建了一个与原始图像相同大小的单通道图像。然后,使用cvThreshold函数将图像根据设定的阈值进行二值化处理。对于引用中的代码,使用了cv.THRESH_OTSU方法来自动确定最佳阈值。而引用中的代码使用了手动设定的阈值进行二值化处理。通过使用适当的阈值和合适的方法,可以实现图像的阈值分割。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [opencv 阈值分割](https://download.csdn.net/download/u011733522/7271565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [opencv实现阈值分割](https://blog.csdn.net/qq_51491920/article/details/125727129)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值