opencv基础学习与实战(3)图像形态学与边缘检测
一.图像形态学
1.图像腐蚀
函数为:cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue) 参数含义: src: 输入的图像 kernel: 用于腐蚀的结构元件如果element = Mat(), 则使用3 × 3的矩形结构单元。 dst: 它是与src相同大小和类型的输出图像。 iterations:腐蚀操作的迭代次数, 默认为1。次数越多, 腐蚀操作执行的次数越多,腐蚀效果越明显
import numpy as np
sun = cv2.imread('erode1.png')
cv2.imshow('src', sun)
# cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8) # 设置kenenel大小, 核改为5*5试试
erosion_1 = cv2.erode(sun,kernel,iterations=2) # iterations改为5试试
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
效果:
可以观察出原图的细线被腐蚀消失了
2.图像膨胀
函数为: cv2.dilate(img, kernel, iterations) 参数含义: img - 目标图片 kernel - 进行操作的内核,默认为3×3的矩阵 iterations - 膨胀次数,默认为1
wenzi = cv2.imread('word.png')
cv2.imshow('src1', wenzi)
# cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8) # 设置kenenel大小
wenzi_new = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)
效果:
可以观察到,膨胀后的字母变粗与变亮了
3.开运算与必运算
开运算:先腐蚀后膨胀。作用:平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src2', zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8) # 设置kenenel大小
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel) # 开运算
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
效果:
先腐蚀后的图消除了许多噪声点,在膨胀后,指纹显得更加明显
闭运算:先膨胀后腐蚀 作用:弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。
zhiwen_duan = cv2.imread('zhiwen_duan.png')
cv2.imshow('src3', zhiwen_duan)
cv2.waitKey(0)
kernel = np.ones((5,5),np.uint8) # 设置kenenel大小
zhiwen_new = cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel) # 闭运算
cv2.imshow('zhiwen_new1',zhiwen_new)
cv2.waitKey(0)
效果:
图像的断裂处有些许拟合
4.梯度运算
梯度运算:膨胀-(减去)腐蚀 作用:突出显示图像中强度变化剧烈的地方
wenzi = cv2.imread('word.png')
cv2.imshow('word_new', wenzi)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8) # 设置kenenel大小
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('bianyuan', bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
字母的边缘更明显了
5、顶帽和黑帽
顶帽 = 原始图像 - 开运算结果(先腐蚀后膨胀) 黑帽 = 闭运算(先膨胀后腐蚀) - 原始图像
sun = cv2.imread('erode1.png')
cv2.imshow('sun_yuantu', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8) # 设置kenenel大小
# # 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('TOPHAT', tophat)
cv2.waitKey(0)
# # 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('BLACKHAT', blackhat)
cv2.waitKey(0)
效果:
二.边缘检测
sobel算子
cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]]) 参数: src: 输入图像 ddepth: 输出图像的深度(可以理解为数据类型), -1表示与原图相同的深度 dx, dy: 当组合为dx=1, dy=0时为x方向的一阶导数, 当组合为dx=0, dy=1时为y方向的一阶导数(如果同时为1, 通常效果不佳) ksize: (可选参数)Sobel算子的大小, 必须是1,3,5或者7, 默认为3.
tu=cv2.imread(r'longpic.png')
pro_tu=cv2.Sobel(tu,ddepth=cv2.CV_64F,dx=1,dy=0)
pro_tu_fill_x=cv2.convertScaleAbs(pro_tu)
pro_tu=cv2.Sobel(tu,ddepth=cv2.CV_64F,dx=0,dy=1)
pro_tu_fill_y=cv2.convertScaleAbs(pro_tu)
pro_tu_fill_xy=cv2.addWeighted(pro_tu_fill_x,1,pro_tu_fill_y,1,0)
cv2.imshow('tu2',pro_tu_fill_xy)
cv2.waitKey(0)
laplacian算子
cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) 参数说明: src: 输入图像,可以是灰度图像,也可以是多通道的彩色图像 ddepth: 输出图片的数据深度: ksize: 计算二阶导数滤波器的孔径大小,必须为正奇数,可选项 scale: 缩放比例因子,可选项,默认值为 1 delta: 输出图像的偏移量,可选项,默认值为 0
zl = cv2.imread('longpic.png', cv2.IMREAD_GRAYSCALE)
zl_lap = cv2.Laplacian(zl, cv2.CV_64F)
zl_lap_full = cv2.convertScaleAbs(zl_lap) # 转换为绝对值,负数转换为正数
cv2.imshow('zl_lap_full', zl_lap_full)
cv2.waitKey(0)
canny算子(最常用,sobel升级版)
canny边缘检测 cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]]]) image 为输入图像。 threshold1 表示处理过程中的第一个阈值。fL threshold2 表示处理过程中的第二个阈值。fH
zl = cv2.imread('longpic.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('zl', zl)
cv2.waitKey(0)
zl_canny = cv2.Canny(zl, 110, 120) # 低,高
cv2.imshow('zl_canny', zl_canny)
cv2.waitKey(0)