问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

传统CV算法——threshold阈值算法介绍

创作时间:
作者:
@小白创作中心

传统CV算法——threshold阈值算法介绍

引用
CSDN
1.
https://blog.csdn.net/weixin_42917352/article/details/118684586

在计算机视觉领域,阈值处理是图像分割的重要技术。OpenCV 提供了多种阈值处理方法,其中包括全局阈值(cv.threshold)和自适应阈值(cv.adaptiveThreshold)。本文将详细介绍这两种方法的定义、数学原理、输入参数以及它们的区别。

阈值化函数

在计算机图像视觉中,我们常见的RGB图像包含过多的信息,可能存在一些噪声。因此,使用阈值算法可以降噪,使特征更加明显。一般使用灰度图,需要使用单通道的图片才可以进行阈值化,针对RGB或者HSV格式的图片,我们需要进行灰度化操作才可以进行阈值算法的使用。

import cv2 as cv

img = cv.imread("./images/1.jpg")

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

cv.imshow("gray",gray)

cv.imshow("binary",binary)
cv.waitKey(0)

全局阈值(cv.threshold

定义

全局阈值是将整个图像应用一个固定的阈值进行二值化处理。所有像素值大于该阈值的像素被设置为最大值(通常是255),而小于该阈值的像素被设置为0。

数学原理

给定一个图像 I,全局阈值处理可以表示为:

T = threshold(I(x, y), thresh, maxval, type)

其中:

  • I(x, y) 是输入图像的像素值。
  • thresh 是全局阈值。
  • maxval 是要分配给大于阈值的像素的值(通常为255)。
  • type 是阈值类型(如 cv.THRESH_BINARYcv.THRESH_BINARY_INV)。

输入参数

  • src:输入图像(单通道)。
  • thresh:阈值。
  • maxval:最大值。
  • type:阈值类型。

自适应阈值(cv.adaptiveThreshold

定义

自适应阈值是根据图像的局部特征动态计算阈值。它在图像的每个小区域内计算阈值,从而更好地处理光照不均匀的情况。

数学原理

自适应阈值处理可以表示为:

T(x, y) = mean(I(x', y')) - C

其中:

  • T(x, y) 是位置 (x, y) 的自适应阈值。
  • mean(I(x', y')) 是在邻域 N 内的像素值的平均值。
  • C 是一个常数,用于调整阈值。

自适应阈值的公式可以表示为:

dst(x, y) =
[
\begin{cases}
maxval, & \text{if}I(x,y)>T(x,y) \
0, & \text{otherwise}
\end{cases}
]

输入参数

  • src:输入图像(单通道)。
  • maxValue:最大值(通常为255)。
  • adaptiveMethod:自适应方法(如 cv.ADAPTIVE_THRESH_MEAN_Ccv.ADAPTIVE_THRESH_GAUSSIAN_C)。
  • thresholdType:阈值类型(如 cv.THRESH_BINARYcv.THRESH_BINARY_INV)。
  • blockSize:邻域大小(必须是奇数)。
  • C:从计算的阈值中减去的常数。

区别

  • 阈值计算
  • 全局阈值:使用一个固定的阈值处理整个图像。
  • 自适应阈值:根据局部区域的特征动态计算阈值。
  • 适用场景
  • 全局阈值:适用于光照均匀的图像。
  • 自适应阈值:适用于光照不均匀或具有复杂背景的图像。
  • 处理效果
  • 全局阈值:可能会导致某些区域的细节丢失。
  • 自适应阈值:能够保留更多的细节,适应不同的光照条件。

总结

  • cv.threshold 是全局阈值处理,适用于光照均匀的图像。
  • cv.adaptiveThreshold 是自适应阈值处理,适用于光照不均匀的图像。
  • 两者的选择取决于具体的应用场景和图像特征。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img = cv.imread("./images/2.jpg",cv.IMREAD_GRAYSCALE)
img = cv.GaussianBlur(img,(5,5),sigmaX=0)

ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)

#  blockSize为邻域块的大小、C为偏移值
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,blockSize=9,C=2)

th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,blockSize=9,C=2)

titles = ["Original Image",
          "Global Thresholding(V=127)",
          "Adaptive Mean Thresholding",
          "Adaptive Gaussian Thresholding"]

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])
    plt.xticks([])
    plt.yticks([])
plt.show()

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号