opencv 字符图象 开运算 闭运算_OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)...

本文详细介绍了OpenCV中的形态学操作,包括定义结构元素、腐蚀与膨胀的基本概念,以及开运算、闭运算、顶帽、黑帽和梯度运算的原理和应用。通过实例展示了如何使用OpenCV进行图像处理,以消除噪声、连接分离对象或分离紧密连接的对象。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值