python-opencv,opencv+python

  python-opencv,opencv+python

  阈值处理是将图像分为前景和背景的一种简单而有效的方法。图像分割通常用于根据物体的某些属性(如颜色、边缘或直方图)从背景中提取物体。本文将详细介绍OpenCV中的阈值处理,有需要的可以参考。

  00-1010阈值技术简介简单阈值技术类型简单阈值技术的实际应用

  

目录

  图像分割是许多计算机视觉应用中的关键处理步骤。它通常用于将图像划分为不同的区域,这些区域通常对应于现实世界中的对象。因此,图像分割是图像识别和内容分析的重要步骤。图像阈值是一种简单而有效的图像分割方法,它根据像素的亮度值进行分割。在本文中,我们将介绍OpenCV提供的主要阈值技术,这些技术可以作为计算机视觉应用中图像分割的关键部分。

  

前言

  阈值处理是将图像分为前景和背景的一种简单而有效的方法。图像分割通常用于根据物体的某些属性(如颜色、边缘或直方图)从背景中提取物体。最简单的阈值方法使用预定义的常数(阈值)。如果像素强度小于阈值,它将被黑色像素取代,如果像素强度大于阈值,它将被白色像素取代。OpenCV提供了cv2.threshold()函数对图像进行阈值处理。

  为了测试cv2.threshold()函数,第一次创建了一个测试图像,它包含一些相同大小的区域,用不同的灰色调填充。build_sample_image()函数用于构建这个测试映像:

  def构建_样本_图像():

  创建一个相同大小的区域,填充不同的灰色调作为测试图像

  #定义不同的区域

  音调=np.arange(开始=50,停止=300,步进=50)

  #初始化

  result=np.zeros((50,50,3),dtype=uint8 )

  对于tones:中的音调

  img=np.ones((50,50,3),dtype=uint8) * tone

  #沿轴连接阵列

  result=np.concatenate((result,img),轴=1)

  回送结果

  接下来,将使用不同的预定义阈值:0、50、100、150、200和250来调用cv2.threshold()函数,以查看不同的预定义阈值对阈值图像的影响。例如,用阈值thresh=50对图像进行阈值处理:

  ret1,thresh 1=cv2 . threshold(gray _ image,50,255,cv2。THRESH_BINARY)

  其中thresh1是仅包含黑色和白色的阈值图像。在源gray_image中,灰度小于50的像素为黑色,灰度大于50的像素为白色。

  通过使用多个不同的阈值对图像进行阈值处理:

  #可视化功能

  def show _ img _ with _ matplotlib(color _ img,title,pos):

  img_RGB=color_img[:-1]

  ax=plt.subplot(7,1,pos)

  plt.imshow(img_RGB)

  plt.title(title,fontsize=8)

  plt.axis(“关”)

  #使用build_sample_image()函数构建一个测试映像

  image=build _样本_图像()

  gray_image=cv2.cvtColor(image,cv2。COLOR_BGR2GRAY)

  对于范围(6):中的I

  #用多个不同的阈值对图像进行阈值处理

  ret,thresh=cv2 . threshold(gray _ image,50 * i,255,cv2。THRESH_BINARY)

  #可视化

  show _ img _ with _ matplotlib(cv2 . CVT color(thresh,cv2。COLOR_GRAY2BGR), threshold={

  }".format(i * 50), i + 2)

  # 可视化测试图像

  show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img with tones of gray - left to right: (0,50,100,150,200,250)", 1)

  # 图像进行阈值处理后,常见的输出是黑白图像

  # 因此,为了更好的可视化效果,修改背景颜色

  fig.patch.set_facecolor(silver)

  plt.show()

  

  从上图可以看出,根据阈值和样本图像灰度值的不同,阈值处理后生成的黑白图像的变化情况。

  

  

简单的阈值技术

  上一节中,我们已经简单介绍过了 OpenCV 中提供的简单阈值处理函数——cv2.threshold(),该函数用法如下:

  

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

  cv2.threshold() 函数对 src 输入数组(可以为单通道或多通道图像)应用预定义常数 thresh 设置的阈值;type 参数用于设置阈值类型,阈值类型的可选值如下:cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INVcv2.THRESH_OTSUcv2.THRESH_TRIANGLE

  maxval 参数用于设置最大值,其仅在阈值类型为 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 时有效;需要注意的是,在阈值类型为 cv2.THRESH_OTSUcv2.THRESH_TRIANGLE 时,输入图像 src 应为为单通道。

  

  

阈值类型

  为了更好的了解阈值操作的不同类型,接下来给出每种阈值类型的具体公式。符号说明:src 是源(原始)图像,dst 对应于阈值化后的目标(结果)图像,因此,src(x, y) 对应于源图像像素 (x, y) 处的强度,而 dst(x, y) 对应于目标图像像素 (x, y) 处的强度。

  阈值类型 cv2.THRESH_BINARY 公式如下:

  

  其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度 dst(x,y) 将被设为 maxval;否则,设为 0

  阈值类型 cv2.THRESH_BINARY_INV 公式如下:

  

  其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度 dst(x,y) 将被设为 0;否则,设为 maxval

  阈值类型 cv2.THRESH_TRUNC 公式如下:

  

  其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度设置为 threshold;否则,设为 src(x, y)

  阈值类型 cv2.THRESH_TOZERO 公式如下:

  

  其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素值将设置为 src(x, y);否则,设置为 0

  阈值类型 cv2.THRESH_TOZERO_INV 公式如下:

  

  其表示,如果像素 src(x, y) 的强度大于 thresh,则目标图像像素值将设置为 0;否则,设置为 src(x, y)

  而 cv2.THRESH_OTSUcv2.THRESH_TRIANGLE 属于特殊的阈值类型,它们可以与上述阈值类型( cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INV)进行组合。组合后,阈值处理函数 cv2.threshold() 将只能处理单通道图像,且计算并返回最佳阈值,而非指定阈值。

  接下来使用不同阈值类型对同样的测试图像进行阈值处理,观察不同阈值处理效果:

  

ret1, thresh1 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY)

  ret2, thresh2 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY)

  ret3, thresh3 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY_INV)

  ret4, thresh4 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY_INV)

  ret5, thresh5 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TRUNC)

  ret6, thresh6 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TOZERO)

  ret7, thresh7 = cv2.threshold(gray_image,100,255, cv2.THRESH_TOZERO_INV)

  # 可视化

  show_img_with_matplotlib(cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 255", 2)

  show_img_with_matplotlib(cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 220", 3)

  show_img_with_matplotlib(cv2.cvtColor(thresh3, cv2.COLOR_GRAY2BGR), "THRESH_BINARY_INV - thresh = 100", 4)

  # 其他图像可视化方法类似,不再赘述

  # ...

  

  如上图所示,maxval 参数仅在使用 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 阈值类型时有效,上例中将 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 类型的 maxval 值设置为 255220,以便查看阈值图像在这两种情况下的变化情况。

  

  

简单阈值技术的实际应用

  了解 cv2.threshold() 不同参数的工作原理后,我们将 cv2.threshold() 应用于真实图像,并使用不同的阈值:

  

# 加载图像

  image = cv2.imread(example.png)

  gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  # 绘制灰度图像

  show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img", 1)

  # 使用不同的阈值调用 cv2.threshold() 并进行可视化

  for i in range(8):

   ret, thresh = cv2.threshold(gray_image, 130 + i * 10, 255, cv2.THRESH_BINARY)

   show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(130 + i * 10), i + 2)

  

  以上就是Python OpenCV阈值处理详解的详细内容,更多关于OpenCV阈值处理的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: