当前位置:   article > 正文

Opencv笔记(4):图像阈值和Canny边缘检测_边缘检测阈值设定方法

边缘检测阈值设定方法

目录

1-图像阈值 

2-Canny边缘检测

基本流程

高斯滤波器

梯度和方向

非极大值抑制

双阈值检测

代码实现


1-图像阈值 

ret,dst=cv2.threshold(src,thresh,maxval,type)这个函数接受一个图像,并对其进行阈值操作处理

  • ret:实际使用的阈值
  • dst:返回的图像
  • src:原图像名(单通道灰度图像
  • thresh:自己设定的灰度值的阈值
  • maxval:像素可以设置的最大值,一般为255
  • type:要应用的阈值类型

常见阈值类型:

  • cv2.THRESH_BINARY:像素的强度大于阈值时,设置为 maxval,否则设置为 0。(比较亮的地方变成白色,比较黑的地方变成黑色
  • cv2.THRESH_BINARY_INV反转的二进制阈值。像素的强度大于阈值时,设置为 0,否则设置为 maxval。(比较亮的地方变成黑色,比较黑的地方变成白色
  • cv2.THRESH_TRUNC:截断阈值。像素的强度大于阈值时,设置为阈值本身。(>thresh的就变成thresh
  • cv2.THRESH_TOZERO:阈值设为零。像素的强度小于阈值(thresh,比较暗的)时,设置为 0(黑色),否则保持不变。
  • cv2.THRESH_TOZERO_INV:反转的阈值设为零。像素的强度大于阈值时,设置为 0,否则保持不变。
  1. import cv2
  2. import matplotlib.pyplot as plt
  3. img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)#转化为灰度图
  4. ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
  5. ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
  6. ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
  7. ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
  8. ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
  9. titles=['Original image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
  10. images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]
  11. for i in range(6):
  12. plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
  13. plt.title(titles[i])
  14. plt.xticks([]),plt.yticks([])
  15. plt.show()

#plt.xticks([]) 和 plt.yticks([]) 是 Matplotlib 中用于设置 x 轴和 y 轴刻度的函数。通过传递一个空列表 [] 给它们,我们可以将刻度禁用,从而在图形中隐藏刻度标签。

原图

2-Canny边缘检测

基本流程

  1. 使用高斯滤波器(见opencv笔记(3):图像平滑处理,对图像进行平滑处理,去除噪点
  2. 计算每个像素点的梯度强度和方向
  3. 应用非极大值抑制(NMS),以消除边缘检测带来的杂散效应(想象1:联想人脸检测,只保留最有特征的一部分)(想象2:想象一下你站在一个山谷里,四周有很多山峰。你的任务是找到这个山谷里最高的山峰,并标记它们。但是你不想把所有的山峰都标记出来,因为这样会让你的标记变得混乱,只需要找到最高的那座山峰即可。)NMS 的核心思想就是保留局部最强的边缘,而抑制掉那些不是局部最强的边缘。这样可以使得最终的边缘图更加清晰和准确,有助于后续的图像处理和分析。(对每个对象得到一个检测的方法)
  4. 应用双阈值,来检测真实以及潜在的边缘
  5. 通过抑制孤立的弱边缘完成检测

高斯滤波器

梯度和方向

这里用的是sobel算子

非极大值抑制​​​​​​​

只要保留0.9最大(概率最大的那个)的框框

原理的话我暂时没怎么理解等我理解了再写一篇文章

双阈值检测

maxVal和minVal两个阈值

代码实现

  1. import cv2
  2. import numpy as np
  3. def cv_show(img,name):
  4. cv2.imshow(name,img)
  5. cv2.waitKey()
  6. cv2.destroyAllWindows()
  7. img=cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)
  8. v1=cv2.Canny(img,80,150)#80minVal,150maxVAL,是自己设置
  9. v2=cv2.Canny(img,50,100)
  10. res=np.hstack((v1,v2))
  11. cv_show(res,'res')

maxVal指定的越大,要求越高;反之,要求越低

minVal指定的越小,要求越高;反之,要求越低

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/656952
推荐阅读
相关标签
  

闽ICP备14008679号