*本文学习资源来处OpenCV官网文档*

一、概念

数学形态学 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。

目标:不同的形态变化方式:Erosion,Dilation,Opening,Closing

腐蚀和膨胀是针对白色(高亮)部分而言,而不是针对黑色部分。

二、说明

1. Erosion 腐蚀

腐蚀的基本思想就像土壤侵蚀一样,它会侵蚀前景物体的边界(总是试图保持前景为白色)。
运算方式:内核在图像中滑动(如在2D卷积中),只有当内核下的像素都是1时,原始图像中的像素(1或0)才会被视为1,否则它将被侵蚀(变为零)。

其结果:边界附近的所有像素都将被丢弃,具体取决于内核的大小。因此,前景对象的厚度或大小减小,或者图像中的白色区域减小。

应用场景:消除噪声、分割出独立的图像元素,在图像中连接相邻的元素(将图像与背景连接更自然)、寻找图像中的明显的极大值区域或极小值区域、求出图像的梯度。

代码示例

import cv2import numpy as npimg = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)# 设置卷积核kernel = np.ones((5, 5), np.uint8)# 图像腐蚀处理erosion = cv2.erode(img, kernel, iterations=1)cv2.imshow('img', img)cv2.imshow('erosion', erosion)cv2.waitKey(0)cv2.destroyAllWindows()

效果:

2. 膨胀 Dilation

膨胀恰好与腐蚀相反。如果内核下的至少一个像素为“1”,则像素元素为“1”,它增加了图像中的白色区域或前景对象的大小增加。
通常,在去除噪音的情况下,腐蚀之后再膨胀。因为,腐蚀会消除白噪声,但它也会缩小我们的物体,所以我们需要再扩大它。由于噪音消失了,它们不会再回来,但我们的物体区域会增加。它也可用于连接对象的破碎部分。

import cv2import numpy as npimg = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)# 设置卷积核kernel = np.ones((5, 5), np.uint8)dilation = cv2.dilate(img,kernel,iterations = 1)cv2.imshow('img', img)cv2.imshow('dilation', dilation)cv2.waitKey(0)cv2.destroyAllWindows()

3. 开运算(Opening)

开运算是腐蚀再膨胀的另一种说法,它有助于消除噪音。

import cv2import numpy as npimg = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)# 设置卷积核kernel = np.ones((5, 5), np.uint8)opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)cv2.imshow('img', img)cv2.imshow('opening', opening)cv2.waitKey(0)cv2.destroyAllWindows()

4. 闭运算(Closing)

开运算与闭运算,腐蚀和膨胀是相反的。闭运算就是先膨胀再腐蚀,它可用于关闭前景对象内的小孔或对象上的小黑点。

import cv2import numpy as npimg = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)# 设置卷积核kernel = np.ones((5, 5), np.uint8)closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv2.imshow('img', img)cv2.imshow('closing', closing)cv2.waitKey(0)cv2.destroyAllWindows()

5. 形态梯度(Morphological Gradient)

执行运算:dst = morph_{grad}( src, element ) = dilate( src, element ) - erode( src, element )
效果类似给对象描边:

import cv2import numpy as npimg = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)# 设置卷积核kernel = np.ones((5, 5), np.uint8)gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)cv2.imshow('img', img)cv2.imshow('gradient', gradient)cv2.waitKey(0)cv2.destroyAllWindows()

6. Top Hat

原图像与开运算结果图之差:dst = tophat( src, element ) = src - open( src, element )
作用:分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

7. Black Hat

闭运算结果图与原图像之差:dst = blackhat( src, element ) = close( src, element ) - src
黑帽运算常用来分离比邻近点暗一些的斑块.

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

三、结构元素(Structuring Element)

前面示例中的结构元素都是矩形。在某些情况下,可能需要椭圆/圆形内核。

OpenCV有一个函数cv2.getStructuringElement(),只需传递内核的形状和大小,即可获得所需的内核。

# Rectangular Kernel>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))array([[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]], dtype=uint8)# Elliptical Kernel>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))array([[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]], dtype=uint8)# Cross-shaped Kernel>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))array([[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]], dtype=uint8)

python 图像刚性变换_Python-OpenCV 19. 图像处理形态学变换相关推荐

  1. python图像轮廓识别_Python+OpenCV图像处理(十六)—— 轮廓发现

    简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: importcv2 as cvimportnumpy as npdefcontou ...

  2. python图像缺陷检测_python OpenCV 实现缺陷检测

    机器视觉第七次实验 一.实验目的 通过OpenCV第七次进行实验,对图片进行缺陷检测. 二.实验内容 对图片进行缺陷测量. 三.实验过程 我使用的是python语言+openCV对图片进行缺陷检测的功 ...

  3. python图像融合算法_Python OpenCV 实现图像融合

    原标题:Python OpenCV 实现图像融合 来自:https://www.linuxmi.com/python-opencv-image-blending.html 在本文中,我们将讨论Pyth ...

  4. python 图像无缝拼接_Python+OpenCV实现图像的全景拼接的代码

    环境:python3.5.2 + openCV3.4 1.算法目的 将两张相同场景的场景图片进行全景拼接. 2.算法步骤 本算法基本步骤有以下几步: 步骤1:将图形先进行桶形矫正 没有进行桶形变换的图 ...

  5. python 检测直线 交点_Python+OpenCV图像处理——实现直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

  6. python图像腐蚀处理_Python图像处理之膨胀与腐蚀的操作

    引言 膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩.在本文中我们将了解使用内核的图像膨胀与腐蚀的基本原理. 让 ...

  7. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  8. python图像去污_python图像去雾总结

    本人qq号:226607573,欢迎互相讨论的伙伴们 毕设期间对python图像去雾的学习与总结 近年来,雾霾越来越严重,导致户外获取的图像严重退化,何如将户外获取的有雾图像复原成高质量的清晰图像,已 ...

  9. python ocr 识别车牌_python+opencv+TESSERT-OCR实现车牌的检测与识别

    python+opencv+TESSERT-OCR实现车牌的检测与识别 开学花了十天时间0基础搞出来的,分享给大家,如果有什么错误希望大家给我指正.python师从小甲鱼,opencv师从贾志刚,B站 ...

  10. python怎么打印图片_Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头...

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的python科学计算库 ...

最新文章

  1. Java中正则表达式的学习
  2. 通过一个图来简单描述一下 socket 链接建立以及通信的模型
  3. javascript高程3 学习笔记(三)
  4. oracle表设计实践,Oracle数据库实训报告.docx
  5. [HDU4635] Strongly connected
  6. ssh免密码登陆设置
  7. 消除单点,一篇搞定 | 架构设计篇
  8. IIS7的FTP出错: 451 No mapping for the unicode character exists in the target multi-byte code page
  9. [译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)
  10. 内联元素与内联块状元素
  11. 图中两点所有路径_8数培优:一只很励志的蚂蚁,揭示空间最短路径问题
  12. 李沐动手学深度学习V2-语义分割和Pascal VOC2012数据集加载代码实现
  13. 迷宫问题(MAZE)
  14. 谷歌SEO算法更新大全(2010-2021)
  15. 编程之美1 哈利波特买书问题
  16. RuntimeError: stack expects each tensor to be equal size
  17. 互联网日报 | 3月23日 星期二 | 京东集团8亿美元增持达达集团;阿里云盘正式启动公测;快手进军二手电商...
  18. 使用 EPUB 制作数字图书(转发)
  19. 10大最具影响力人物
  20. 【EtherCAT理论篇】一、EtherCAT现场总线概述

热门文章

  1. 190228每日一句
  2. 190223每日一句
  3. WinEdt 参考文献格式
  4. Atitti css transition Animation differ区别
  5. Atitit.cateService分类管理新特性与设计文档说明v1
  6. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现
  7. paip.提升开发效率之查询界面
  8. 冲刺个税递延,第三批养老目标基金正式获批!合计已达40只
  9. 货币基金新规将出,限制T+0提现及支付额度
  10. (转)Rust: 在vscode配置 Rust 开发环境