一、导数和梯度
1.1 索贝尔算子cv2.Sobel()
表示微分常用的算子是sobel算子,sobel算子可以实现任意阶导数和混合偏导数。
sobel算子的一个好处就是可以将核定义为任何大小,并且可以快速迭代的构造这些核。大的核可以更好的近似导数,因为可以消除噪声的影响,不过假如导数在空间上变化剧烈,核太大可能发生偏差。
dst=cv2.Sobel(src, ddepth, dx, dy, ksize=None, scale=None, delta=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ddepth | 输出图像的深度或类型如cv.CV_32F |
dx | 求导顺序,取值为0,1,o代表不求导 |
dy | 求导顺序,取值为0,1,0代表不求导 |
ksize=None | 滤波器的宽和高 |
scale=None | 计算的导数值的可选比例因子 |
delta=None | 在将结果存储之前将其添加到结果中,增量值。 |
borderType=None | 边界填充的类型 |
grad_x=cv.Sobel(image,cv.CV_32F,1,0)#求dx
grad_y = cv.Sobel(image, cv.CV_32F, 0, 1) #求dy
1.2 Scharr算子cv2.Scharr()
Scharr算子比Sobel算子更加准确,熟读同样很快。
dst=cv2.Scharr(src, ddepth, dx, dy, scale=None, delta=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ddepth | 输出图像的深度或类型如cv.CV_32F |
dx | 求导顺序,取值为0,1,o代表不求导 |
dy | 求导顺序,取值为0,1,0代表不求导 |
ksize=None | 滤波器的宽和高 |
scale=None | 计算的导数值的可选比例因子 |
delta=None | 在将结果存储之前将其添加到结果中,增量值。 |
borderType=None | 边界填充的类型 |
grad_x=cv.Scharr(image,cv.CV_32F,1,0)#求dx
grad_y = cv.Scharr(image, cv.CV_32F, 0, 1) # 求dy
1.2 拉普拉斯算子cv2.Laplacian()
Laplacian算子可以通过二阶导数定义,因此可以把它的离散实现与二阶Soble导数联系起来(OpenCV在实现laplacian算子时使用了sobel算子)laplacian算子就是图像在x,y轴方向上导数之和。
dst=cv2.Laplacian(src, ddepth, ksize=None, scale=None, delta=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ddepth | 输出图像的深度或类型如cv.CV_32F |
ksize=None | 滤波器的宽和高 |
scale=None | 计算的导数值的可选比例因子 |
delta=None | 在将结果存储之前将其添加到结果中,增量值。 |
borderType=None | 边界填充的类型 |
dst=cv.Laplacian(image,cv.CV_32F)#求二阶导
二、图像形态学
2.1 腐蚀和膨胀
最基础的形态学变换就是腐蚀和膨胀,他们在许多方面得到应用,比如消除噪声、元素分割和连接。基于这两种操作,可以实现更复杂的形态学操作,用来定位强度峰值或孔洞、另一种形式的梯度等。
图像的形态学操作通常在阈值化操作后的布尔图像上进行,不过由于膨胀和腐蚀只是局部最大最小值的操作,因此形态学操作也可以在强度图像上进行。
2.1.1 腐蚀cv.erode()
腐蚀计算的是核覆盖范围内的局部最小值。腐蚀缩减了明亮区域,消除凸起,通常用于消除图中斑点一样的噪声,原理是斑点经过腐蚀之后哦会消失,而大的可见区域不受影响。
dst=cv2.erode(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)
参数 | 含义 |
---|---|
src | 输入图像 |
kernel | 滤波器的宽和高 |
iterations=None | 迭代次数,如果不为1则自定重复多次调用这个函数 |
borderType=None | 边界填充的类型 |
borderValue=None | 当边界填充类型为BORDER_CONSTANT时,填入该值 |
dst=cv.erode(binary,(3,3))
2.1.2 膨胀cv2.dilate()
膨胀是一种卷积操作,它将目标像素的值替换为卷积核覆盖区域的局部最大值。膨胀扩大了明亮区域,填充了凹面。通常用于发现联通分支。
dst=cv2.dilate(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)
参数 | 含义 |
---|---|
src | 输入图像 |
kernel | 滤波器的宽和高 |
iterations=None | 迭代次数,如果不为1则自定重复多次调用这个函数 |
borderType=None | 边界填充的类型 |
borderValue=None | 当边界填充类型为BORDER_CONSTANT时,填入该值 |
#膨胀
dst=cv.dilate(binary,(3,3))
2.2 通用形态学函数cv2.morphologyEx()
当处理的图像是二值图像时,基本的腐蚀和膨胀就够了,但是需要对灰度图或者彩色图进行处理时,需要其他操作实现,cv2.morphologyEx()
对于一副非布尔型图像进行形态学操作时,闭操作最明显的效果是消除值小于邻域内点的孤立异常值,而开操作消除的是大于领域内点的孤立异常值。
dst=cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数 | 含义 |
---|---|
src | 输入图像 |
op | 操作 |
kernel | 滤波器的宽和高 |
iterations=None | 迭代次数,如果不为1则自定重复多次调用这个函数 |
borderType=None | 边界填充的类型 |
borderValue=None | 当边界填充类型为BORDER_CONSTANT时,填入该值 |
op操作 | 作用 |
---|---|
cv2.MORPH_OPE | 开操作 |
cv2.MORPH_CLOSE | 闭操作 |
cv2.MORPH_TOPHAT | 顶帽操作 |
cv2.MORPH_BLACKHAT | 黑帽操作 |
cv2.MORPH_GRADIENT | 形态学梯度 |
dst2=cv.morphologyEx(binary,cv.MORPH_CLOSE,(3,3))#参数,第二个为闭操作
2.2.1 开操作cv2.MORPH_OPEN
开操作:先对图像进行腐蚀,再对图像进行膨胀。
开操作通常对二值图像中的区域进行计数,例对显微镜载玻片上细胞的图像已经进行阈值处理,在对区域进行计数之前,需要用开操作来将相互靠的很近的细胞分开。
dst1=cv.morphologyEx(binary,cv.MORPH_OPEN,(3,3)l)#参数,第二个为开操作
2.2.2 闭开操作cv2.MORPH_CLOSE
闭操作:先对图像进行膨胀,之后再对图像进行腐蚀。
闭操作用于复杂联通分支算法中减少无用或噪声驱动的片段。对于联通分支,通常进行腐蚀或闭操作消除噪声,然后通过开操作连接相互靠近的大型区域
dst1=cv.morphologyEx(binary,cv.MORPH_CLOSE,(3,3))#参数,第二个为闭操作
2.2.3 形态学梯度cv2.MORPH_GRADIENT
形态学梯度=膨胀操作的结果(扩张亮域)— 腐蚀操作的结果(缩减亮域)。结果就是产生图像中目标的边缘。
2.2.3 顶帽(cv2.MORPH_TOPHAT)和黑帽(cv2.MORPH_BLACKHAT)
顶帽和黑帽操作分别用于显示与其邻域相比更亮或更暗的部分。
顶帽操作=原图像—开操作后的图像
黑帽操作=原图像—闭操作后的图像
2.3 自定义核cv2.getStructuringElement()
迄今为止我们用到的形态学操作中,使用的核大小总是3×3的矩形。opencv可以让你自己创建自己的核,在形态学上核通常称为结构元素。
dst=cv2.getStructuringElement(shape, ksize, anchor=None)
参数 | 含义 |
---|---|
shape | 形状 |
kernel | 滤波器的宽和高 |
shape选项 | 作用 |
---|---|
cv2.MORPH_RECT | 矩形 |
cv2.MORPH_ELLIPSE | 椭圆形,以ksize.width和ksize.height为两个半径做椭圆 |
cv2.MORPH_CROSS | 交叉 |
#模板/结构元素
kernel=cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst1=cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)#参数,第二个为开操作