OpenCV第三章——阈值

1. 阈值处理函数

threshold()方法用于对对象进行阈值处理,该方法的语法如下:

retval, dst  = cv2.threshold(src, thresh, maxval, type)

参数说明:

src: 被处理的图像

thresh: 阈值, 在范围(125-150)效果最好

maxval: 阈值处理采用的最大值

type: 阈值处理类型

返回值说明:

retval: 处理时采用的阈值

dst: 阈值处理后的图像

                                                   阈值处理类型及其含义

  1. cv2.THRESH_BINARY:将像素值大于阈值的部分设为最大值(通常是255),其余部分设为0。这种方法常用于图像二值化。

  2. cv2.THRESH_BINARY_INV:将像素值小于阈值的部分设为最大值(通常是255),其余部分设为0。这是THRESH_BINARY的反向操作。

  3. cv2.THRESH_TRUNC:将像素值大于阈值的部分设为阈值,其余部分保持不变。用于将像素值限制在阈值以下。

  4. cv2.THRESH_TOZERO:将像素值小于阈值的部分设为0,其余部分保持不变。这有助于去除低于阈值的噪声。

  5. cv2.THRESH_TOZERO_INV:将像素值大于阈值的部分设为0,其余部分保持不变。这是THRESH_TOZERO的反向操作。

  6. cv2.THRESH_OTSU:使用大津法自动确定最佳阈值,用于图像二值化。通常与THRESH_BINARYTHRESH_BINARY_INV一起使用。

  7. cv2.THRESH_TRIANGLE:使用三角形法自动确定最佳阈值,这是一种自动阈值计算方法,适用于图像直方图具有明显双峰的情况。

2. 二值化处理

       二值化处理(二值化阈值处理)让图像仅保留两种像素值,处理时, 每一个像素值都会与阈值进行比较,将大于阈值的像素值变为最大值, 将小于阈值的像素值变为0,计算公式如下:

if  像素值 <=  阈值:像素值 = 0

if  像素值 > 阈值 : 像素值 = 最大值

        通常使用像素值255(纯白色)为最大值, 0(纯黑色)为最小值

                                       

2.1 处理黑白渐变图

下面的示例代码:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.waitKey()
cv2.destrotAllWindows()

处理后的结果:

可以看到处理过后呈现出了非黑即白的效果。

2.2  不同阈值的处理效果

示例代码如下:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 180, 255, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()

 原图中像素值大于127的较多,大于180的较少,因而阈值设为127时,纯白色像素较多,阈值设为180时纯黑色像素较多。

2.3 不同最大值的处理效果

示例代码如下:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()

最大阈值设为150时, 大于i120的像素值都被改为150, 呈现灰色。 

对于彩色图像也可以进行二值化阈值处理:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 1) # 读成彩色图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()

2.4 反二值化处理

反二值化阈值处理,处理结果与二值化处理结果相反, 将大于阈值的像素值变为0, 将小于或等于阈值的像素值变为最大值,原图中黑白部分交换,公式如下 :

if 像素值 <= 阈值:像素值 = 最大值

if 像素值 > 阈值:像素值 = 0

 示例代码如下:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY_INV) # 反二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()

3. 零处理 

将某个范围内的像素值变为0, 而范围之外的像素保留原值,包括低于阈值零处理和超出阈值零处理

3.1 低于阈值零处理

if 像素值 <= 阈值:像素值 = 0

if 像素值 <= 阈值:像素值 = 原值

 示例代码如下:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO) # 低于阈值零处理

cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()

 

3.2 超出阈值零处理

if 像素值 <= 阈值:像素值 = 原值

if 像素值 > 阈值: 像素值 = 0

示例代码如下:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO_INV) # 超出阈值零处理

cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()

浅色区域彻底变黑,深色区域不受影响。 

 

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TRUNC) # 截断处理

cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()

4. 截断处理

截断阈值处理, 将图像中大于阈值的像素值变为和阈值一样的值,小于或等于阈值的像素保持原值。公式如下:

if 像素 <= 阈值:像素值 = 原值

if 像素 > 阈值:像素 = 阈值

 

整体颜色变暗, 浅色区域变得更浅 

 

5 .自适应处理

OpenCV提供了adaptivateThreshold(src, macvalue, adaptivateMethod, thresholdType, blockSize, C)

参数说明:

src: 被处理的灰度图像

maxvalue: 阈值处理采用的最大值

adaptivateMethod: 自适应阈值的计算方法

thresholdType: 阈值处理类型(cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV)

blocksize: 一个正方形区域的大小

C:常量

返回值说明:

dst: 阈值处理后的图像

                                        自适应阈值的计算方法及其解释

cv2.ADAPTIVE_THRESH_MEAN_C :

  • 对于每个像素,计算其邻域区域(通常是一个窗口)的平均值,并用这个平均值作为该像素的阈值。

 cv2.ADAPTIVE_THRESH_GAUSSIAN_C:

  • 对于每个像素,计算其邻域区域的加权平均值(权重根据高斯分布来决定),并用这个加权平均值作为该像素的阈值。

5.1 无法得到清晰有效的结果

示例代码如下:

import cv2

image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY_INV) # 反二值化阈值处理
t3, dst3 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO) # 低于阈值零处理
t4, dst4 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO_INV) # 超出阈值零处理
t5, dst5 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TRUNC) # 截断处理

cv2.imshow("BINARY", dst1)
cv2.imshow("BINARY_INV", dst2)
cv2.imshow("TOZERO", dst3)
cv2.imshow("TOZERO_INV", dst4)
cv2.imshow("TRUNC", dst5)
cv2.waitKey() 
cv2.destroyAllWindows() 

5.2 显示自适应阈值处理的效果

示例代码如下:

import cv2

image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
# cv2.ADAPTIVE_THRESH_MEAN_C方法
athdMEAM = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# cv2.ADAPTIVE_THRESH_GAUSSIAN_C方法
athdGAUS = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 3)

cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey() 
cv2.destroyAllWindows() 

6. Otsu方法

Ostu方法语法结构如下:

retval, dst = cv2.thresholdZ(src ,thresh, maxval, type)

参数说明:

src: 被处理的灰度图像

thresh:阈值(需要设为0)

maxval: 阈值处理采用的最大值

type: 阈值处理类型,例如:cv2.THRESH_BINARY+cv2.THRESH_OTSU

返回值说明:

retval: you Ostu方法计算得到并使用的最合适阈值

dst:处理后的图像

 示例代码如下:

import cv2

image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
# 实现Otsu方法的阈值处理
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY  + cv2.THRESH_OTSU)
cv2.putText(dst2, "best threshold: " + str(t2), (0, 30),
         cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) # 在图像上绘制最合适的阈值
cv2.imshow("BINARY", dst1) 
cv2.imshow("OTSU", dst2) 
cv2.waitKey() 
cv2.destroyAllWindows() 

7. 阈值处理实例

示例代码如下:

import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(4).jpg")  # 原始图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图像
t1, dst1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理
t2, dst2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)  # 反二值化阈值处理
cv2.imshow("img", img)  
cv2.imshow("gray", gray)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()  
cv2.destroyAllWindows()  

二值化处理后, 汽车边缘变得更加鲜明, 更容易被识别。 

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opencv是一个开源的计算机视觉库,opencv2.4.9是其中的一个版本。在opencv2.4.9中,有一个模块叫做stitching,用于图像拼接。 图像拼接是将多张图像按照一定的顺序和方式进行合并,形成一张更大视野覆盖范围的图像。拼接的过程需要解决图像间的重叠区域匹配、图像变换与叠加等问题。 在opencv2.4.9的stitching模块中,主要有以下几个重要的类: 1. Stitcher类:拼接器类,用于执行拼接的主要操作。它提供了一系列的方法,如设置拼接的模式、添加要拼接的图像等。 2. FeaturesFinder类:特征点检测类,用于在图像中寻找特征点。该类利用SIFT、SURF等算法来检测图像中的关键点,以便进行匹配。 3. FeaturesMatcher类:特征点匹配类,用于对图像中的特征点进行匹配。该类使用KNN算法进行特征点的匹配,并利用RANSAC算法进一步筛选特征点,剔除误匹配。 4. Estimator类:变换估计类,用于估计图像间的变换参数。该类可以通过特征点的对应关系,计算图像间的旋转矩阵、平移矩阵等变换参数。 5. Blender类:图像融合类,用于将拼接后的图像进行融合。该类可以进行多种融合方式,如线性融合、多频融合等。 通过以上的类和方法,opencv2.4.9的stitching模块能够完成图像拼接的过程。整个过程包括特征点检测、特征点匹配、变换参数估计和图像融合等步骤。 需要指出的是,本文只是对opencv2.4.9的stitching模块进行了初步的介绍,具体的源码分析需要深入研究。整个源码工程庞大,包含很多细节和算法,需要对计算机视觉和图像处理有较深入的理解才能进行分析和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值