12, opencv核心操作学习-形态学转换

335 阅读2分钟

1, 腐蚀

卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值均是 1, 那么中心元素就保持原来的像素值虽否则就变为0。

# coding:utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt


def show(imgs, titles):
    j = 121
    for i in range(len(imgs)):
        plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
        j = j +1
    plt.show()

if __name__ == '__main__':
    img = cv2.imread('./jing.jpg', cv2.IMREAD_UNCHANGED)
    kernel = np.ones((9,9),np.uint8)
    out = cv2.erode(img, kernel,iterations=1)
    show([img, out], ['original', 'erode'])

erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

参数 含义
src 输入图片
kernel 卷积核
dst
anchor 内核的基准点(anchor)
iterations 迭代次数 (即erode多次运算)
borderType 对外边界计算类型

2, 膨胀

卷积核沿着图像滑动,如果与卷积核对应的原图像的像素值有为 1, 那么中心元素就为1

# coding:utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt


def show(img):
    # cv2.namedWindow('aa', cv2.WINDOW_NORMAL)
    cv2.imshow('aa', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    img = cv2.imread('./jing.jpg', cv2.IMREAD_GRAYSCALE)
    show(img)
    kernel = np.ones((9,9),np.uint8)
    out = cv2.dilate(img, kernel,iterations=4)
    show(out)

dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

形态学运算的变种

参数 含义
src 输入图片
kernel 卷积核
dst
anchor 内核的基准点(anchor)
iterations 迭代次数 (即erode多次运算)
borderType 对外边界计算类型
borderValue

3,morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

参数 含义
src 输入图片
op 运算类型
kernel 卷积核
dst
anchor 内核的基准点(anchor)
iterations 迭代次数 (即erode多次运算)
borderType 对外边界计算类型
borderValue
op
取值 含义
cv2.MORPH_OPEN 开运算:先腐蚀, 后膨胀, 用于去除噪音
cv2.MORPH_CLOSE 闭运算:先膨胀, 后腐蚀, 用来填充前景物体中的小洞, 或者前景物体上的小黑点。
cv2.MORPH_GRADIENT 形态学梯度
cv2.MORPH_TOPHAT 礼帽: 原图与开运算的差(src-open)
cv2.MORPH_BLACKHAT 黑帽: 进行闭运算之后得到的图像与原始图像的差。(close-src)
# coding:utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt


def show(img):
    # cv2.namedWindow('aa', cv2.WINDOW_NORMAL)
    cv2.imshow('aa', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    img = cv2.imread('./jing.jpg', cv2.IMREAD_GRAYSCALE)
    show(img)
    kernel = np.ones((9,9),np.uint8)
    out = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    show(out)

4, 结构化元素

之前我们使用的结构化元素(理解为卷积核形状), 但是有时我们需要构建圆形或者椭圆形的核, 我们就需要使用opencv提供的函数来构建卷积核 cv2.getStructuringElement()。

getStructuringElement(shape, ksize, anchor=None)

构建结构化元素(卷积核)

参数 含义
shape 结构化元素的形状
ksize 卷积核大小
anchor 内核的基准点(anchor)
shape
取值 含义
cv2.MORPH_CROSS 十字形卷积核
MORPH_RECT 矩形卷积核
MORPH_ELLIPSE 椭圆卷积核