【1】引言
前序已经学习了腐蚀和膨胀的单独作用函数,还研究了按照不同顺序调用腐蚀和膨胀函数调整图像效果,相关文章包括且不限于:
python学opencv|读取图像(六十一)先后使用cv2.dilate()函数和cv2.erode()函数实现图像处理-CSDN博客
python学opencv|读取图像(六十)先后使用cv2.erode()函数和cv2.dilate()函数实现图像处理-CSDN博客
python学opencv|读取图像(五十九)使用cv2.dilate()函数实现图像膨胀处理-CSDN博客
python学opencv|读取图像(五十八)使用cv2.erode()函数实现图像腐蚀处理-CSDN博客
今天在此基础上,研究另一种图像处理操作:梯度运算。
梯度运算的本质上还是膨胀和腐蚀运算,不过使用膨胀土减去俯视图,随意最后会凸显图像大致的轮廓。
【2】官网教程
点击下述链接,直达cv2.morphologyEx()函数的官网说明页面:
OpenCV: Image Filtering
这个页面主要介绍了cv2.morphologyEx()函数的参数:
图1 cv2.morphologyEx()函数的官网说明页面
具体的,cv2.morphologyEx()函数的参数意义为:
void cv::morphologyEx (
InputArray src, #输入图像
OutputArray dst, #输出图像
int op, #图像操作方法
InputArray kernel, #像素核
Point anchor = Point(-1,-1), #像素核的锚点位置
int iterations = 1, #迭代次数,默认值为1
int borderType = BORDER_CONSTANT, #边界样式,可选参数
const Scalar & borderValue = morphologyDefaultBorderValue() ) #边界值,可选参数
由于cv2.morphologyEx()函数的图像操作方法多,所以点击链接到达方法说明网页:
OpenCV: Image Filtering
在这个页面,主要看梯度方法 MORPH_GRADIENT:
图2 cv2.morphologyEx()函数的方法-官网说明页面
在图2可以看到,MorphTypes下有多种方法,其中erode腐蚀,dilate膨胀已经完成学习。此外,定义了先腐蚀后膨胀为open开运算,先膨胀后腐蚀为close闭运算,膨胀运算减去腐蚀运算是GRADIENT梯度运算。
【3】代码测试
由于只需要在cv2.morphologyEx()函数中直接调用GRADIENT方法就可以实现梯度运算,这里直接给出完整代码:
import cv2 as cv # 引入CV模块
import numpy as np # 引入numpy模块
# 定义核
k = np.ones((3, 3), np.uint8) # 定义核
k1 = np.ones((5, 5), np.uint8) # 定义核
k2 = np.ones((7, 7), np.uint8) # 定义核
# 读取图片
srcm = cv.imread('srcbl.png') # 读取图像srcck.png
# 图像计算
#dstpz1 = cv.dilate(srcm, k) # 图像膨胀运算,膨胀核大小为(3,3)
#dstpz2 = cv.dilate(srcm, k1) # 图像膨胀运算,膨胀核大小为(5,5)
#dstpz3 = cv.dilate(srcm, k2) # 图像膨胀运算,膨胀核大小为(7,7)
#dstfs1 = cv.erode(dstpz1, k) # 图像腐蚀运算,像素核大小为(3,3)
#dstfs2 = cv.erode(dstpz2, k1) # 图像腐蚀运算,像素核大小为(5,5)
#dstfs3 = cv.erode(dstpz3, k2) # 图像腐蚀运算,像素核大小为(7,7)
dst=cv.morphologyEx(srcm,cv.MORPH_GRADIENT,k)
dst1=cv.morphologyEx(srcm,cv.MORPH_GRADIENT,k1)
dst2=cv.morphologyEx(srcm,cv.MORPH_GRADIENT,k2)
# 显示结果
cv.imshow('srcm ', srcm)
cv.imshow('dsttd', dst)
cv.imwrite('dsttd.png', dst)
cv.imshow('dsttd1', dst1)
cv.imwrite('dsttd1.png', dst1)
cv.imshow('dsttd2', dst2)
cv.imwrite('dsttd2.png', dst2)
# 窗口控制
cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
代码运算使用的相关图像有:
图3 初始图像srcbl.png
图4 梯度图像dsttd.png
图5 梯度图像dsttd1.png
图6 梯度图像dsttd2.png
由图3至图6可见,在cv2.morphologyEx()函数中直接调用GRADIENT方法进行梯度运算时,图像效果为膨胀运算减去腐蚀运算,但随着运算使用的像素核的增大,获得的梯度运算图像轮廓逐渐变得不够清晰。
【4】细节说明
梯度运算本身获得的轮廓就是不够精准的轮廓,因此尽可能调小像素核才能获得较为清晰的图像轮廓。
【5】总结
掌握了使用python+opencv调用cv2.morphologyEx()函数实现图像GRADIENT梯度运算的技巧。