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