Fly-AI竞赛服务平台 flyai.com
在开始学习之前推荐大家可以多在
如果需要处理的原图及代码,请移步小编的GitHub地址
形态学操作简单来说,就是改变物体的形状,下面学习一下,首先本文的目录如下:1,定义结构元素
2,腐蚀和膨胀
3,开运算和闭运算
4,礼帽/顶帽,黑帽算法
5,梯度运算
6,形态学运算 检测边和角点(1,检测边缘 ; 2,检测拐角)
1,定义结构元素
形态学操作的原理:在特殊领域运算形式——结构元素(Structure Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小很多,二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素进行膨胀或腐蚀操作时是否需要参与计算。
形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的 getStructuringElement 函数,也可以直接使用 Numpy 的 ndarray 来定义一个结构元素,形象图如下:
下面代码为上图的十字形,代码如下:
#_*_coding:utf-8_*_
import cv2
import numpy as np
def show_element():
element_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
print(element_cross)
element_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
print(element_ellipse)
element_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
print(element_rect)
'''
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]'''
def define_cross_structure():
NpKernel = np.uint8(np.zeros((5, 5)))
for i in range(5):
NpKernel[2, i] = 1
NpKernel[i, 2] = 1
print("NpKernel", NpKernel)
'''
NpKernel [[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
'''
上面我们自定义了一个结构元素 kernel,先声明一个矩阵,然后对其进行赋值,这种方法灵活但是略显复杂。OpenCV提供了一个函数 也就是上面展示的,可以获取常用结构元素的性质:矩形(包括线形),椭圆(包括圆形)以及十字形。下面具体学习一下此方法
1.1 定义一些基本符号和关系
1,元素
设有一幅图像X,若点 a 在 X 的区域以内,则称 a 为 X 的元素,记做 a 属于 X,如图 6.1所示。
2,B包含于X
设有两幅图像 B, X。对于 B中所有的元素 ai, 都有 ai 属于 X,则称B包含于 (included in)X ,记做 B 属于 X,如图6.2所示。
3,B击中 X
设有两幅图像B, X。若存在这一一个点,它即是B的元素,又是 X 的元素,则称 B 击中(hit)X,记做 B ↑ X,如图6.3所示。
4,B不击中 X
设有两幅图像B, X。若不存在任何一个点,它既是B的元素,又是 X的元素,即 B和 X的交集是空,则称 B 不击中(miss)X,记做 B ∩ X = Φ;其中 ∩ 是集合运算相交的符号,Φ 表示空集,如图6.4所示。
5,补集
设有一幅图像 X,所有 X 区域以外的点构成的集合称为 X 的补集,记做 Xc,如下图所示。显然,如果B ∩ X = Φ,则 B 在 X的补集内,即 B 属于 Xc。
6,结构元素
设有两幅图像B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象的称作刷子。结构元素通常都是一些比较小的图像。
7,对称集
设有一幅图像B,将B中所有元素的坐标取反,即令(x, y)变为(-x, -y),所有这些点构成的新的集合称为B的对称集,记做 Bv,如下图6.6所示。
8,平移
设有一幅图像B,有一个点a(x0, y0),将B平移a后的结果是,把B中所有元素的横坐标加 x0,纵坐标加 y0,即令(x, y)变成(x + x0, y+y0),所有这些点构成新的集合称为B的平移,记做 Ba,如图6.7所示。
1.2 getStructuringElement 方法
getStructuringElement 是OpenCV提供的一个函数,getStructuringElement 的内部并没有什么优化实现,只是封装了一些功能,其原理同样是声明了一个矩阵,然后求形状,指定矩阵的值。而我们只需要直接调用即可。
函数原型如下:
def getStructuringElement(shape, ksize, anchor=None):
参数的意思:shape 表示内核的形状,有三种形状可以选择:
——十字形:cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
——椭圆:cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
——矩形:cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))ksi