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,否则保持不变。
import cv2
import matplotlib.pyplot as plt

img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)#转化为灰度图
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)


titles=['Original image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
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两个阈值

代码实现

import cv2
import numpy as np
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
img=cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,80,150)#80minVal,150maxVAL,是自己设置
v2=cv2.Canny(img,50,100)

res=np.hstack((v1,v2))
cv_show(res,'res')

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

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

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值