当前位置: 首页 > news >正文

OpenCV-Python图像运算变换处理:形态学梯度运算及分类

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

一、引言

在前面的《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍》等系列博文中老猿详细介绍了腐蚀和膨胀的原理、算法、Python的模拟实现以及OpenCV函数的详细语法及应用。

图像腐蚀后图像整体就会缩小,而膨胀就会扩大,用膨胀后的图像减去源图像或腐蚀后的图像,或者用源图像减去腐蚀后的图像,都会去除图像前景色中间的部分得到一个图像的轮廓,这些减法运算就是形态学梯度运算。

二、形态学梯度运算简介

按照减法运算参与对象不同,形态学梯度运算又分为基本梯度运算、内部梯度运算和外部梯度运算三种。

2.1、基本梯度运算

基本梯度运算是用膨胀后的图像减去腐蚀后的图像得到差值图像,该图像就是原图像对应的轮廓,称为梯度图,因为该运算也是OpenCV中morphologyEx函数支持的唯一梯度运算(op参数=MORPH_GRADIENT),因此被称为基本梯度。一般说的梯度运算都是指基本梯度。

基本梯度图的计算方式为:dst = dilate (src, kernal) - erode(src, kernal)
使用morphologyEx来执行,则调用方法为:
morphologyEx(src, CV2.MORPH_GRADIENT, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

当kernel核矩阵为一行的二阶矩阵代表X方向的直线时,得到的梯度图称为X方向梯度图,如果使用N行1列的二阶矩阵代表Y方向的直线时,得到的梯度图称为Y方向梯度图,这两种特例统称为方向梯度。

2.2、内部梯度运算

内部梯度就是用源图像减去腐蚀后的图像的运算,得到的目标图像称为内部梯度图,显然内部梯度图的轮廓一定包含在基本梯度图的轮廓中,其轮廓线也必包含在源图像中,因此称为内部梯度图。

内部梯度图的计算方式为:dst = src - erode(src, kernal)

2.3、外部梯度运算

外部梯度就是用膨胀后图像减去源图像的运算,得到的目标图像称为外部梯度图,相对源图像,外部梯度图的轮廓线都是原图像之外,因此称为外部梯度图。

外部梯度图的计算方式为:dst = dilate (src, kernal) - src

三、几种梯度图对比

3.1、源图

下面使用如下一副图来看几种梯度图的效果,图像文件名为“三角圆.jpg”:
在这里插入图片描述

3.2、实现代码

def morphologyExTest(imgObj,imgTitle=''):
    if isinstance(imgObj, str):
        img = cv2.imread(imgObj)#, cv2.IMREAD_GRAYSCALE)
        if img is None:
            img = cv2.imdecode(np.fromfile(imgObj, dtype=np.uint8), -1)
        imgTitle = imgTitle+imgObj+': '
    else:
        imgTitle = imgTitle + ': '

    kernal = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5) )
    imgGradientBasic = preparePreviewImg(imgTitle + '基本梯度,矩形核大小5*5', cv2.morphologyEx(img, cv2.MORPH_GRADIENT , kernal))
    imgGradientExternal = preparePreviewImg(imgTitle + '外部梯度,矩形核大小5*5', cv2.dilate(img,  kernal)-img)
    preparePreviewImg()
    imgGradientInternal = preparePreviewImg(imgTitle + '内部梯度,矩形核大小5*5',img - cv2.erode(img, kernal))
    kernal = np.ones((5, 1), np.uint8)
    imgGradientX = preparePreviewImg(imgTitle + 'X方向梯度,横线核大小5*1', cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernal))
    preparePreviewImg()
    kernal = np.ones((1, 5), np.uint8)
    imgGradientY = preparePreviewImg(imgTitle + 'Y方向梯度,竖线核大小1*5', cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernal))
    preparePreviewImg()

def morphologyTest():
    morphologyExTest(r'f:\pic\三角圆.jpg') #
    previewImgList()

上面代码中使用的图像预览的函数请见《OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析: https://blog.csdn.net/LaoYuanPython/article/details/109984045》的介绍。

3.3、结果图像

在这里插入图片描述

四、小结

本文介绍了图像形态学变换的梯度运算的概念、原理、类别,并举例介绍了几种梯度运算的OpenCV-Python实现以及对应图像效果,可以看到通过图像的梯度运算可以获得图像的轮廓,核的形状对图像梯度运算的影响比较大,当然核的大小同样也有比较大的影响。

五、形态变换博文传送门

下面是老猿博文中与形态变换相关的博文列表:

  1. https://blog.csdn.net/LaoYuanPython/article/details/109441709 OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍
  2. https://blog.csdn.net/LaoYuanPython/article/details/109984045 OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析
  3. https://blog.csdn.net/LaoYuanPython/article/details/109556425 OpenCV-Python图像形态变换概述及morphologyEx函数介绍
  4. https://blog.csdn.net/LaoYuanPython/article/details/109768675 OpenCV-Python图像运算变换处理:形态学梯度运算及分类
  5. https://blog.csdn.net/LaoYuanPython/article/details/110195287 OpenCV-Python中预览超大图的程序实现方法
  6. https://blog.csdn.net/LaoYuanPython/article/details/110223709 OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点
  7. https://blog.csdn.net/LaoYuanPython/article/details/110294445 OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印
  8. https://blog.csdn.net/LaoYuanPython/article/details/110676764 OpenCV-Python击中击不中HITMISS形态变换详解
写作不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

参考博文:

【拜小白opencv】40-形态学滤波5——形态学梯度(基本梯度、内部梯度、外部梯度、方向梯度)

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.csdn.net/laoyuanpython/category_9831699.html)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

相关文章:

  • OpenCV-Python中预览超大图的程序实现方法
  • OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点
  • OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印
  • OpenCV击中击不中HITMISS形态变换公开资料汇总
  • OpenCV图形图像击中击不中HITMISS变换处理基础知识
  • OpenCV-Python图像击中击不中变换理解的关键知识点及自定义实现
  • OpenCV-Python击中击不中HITMISS形态变换详解
  • OpenCV-Python击中击不中变换案例:长方形边界提取
  • OpenCV-Python击中击不中变换案例:绿叶轮廓提取
  • OpenCV-Python击中击不中变换案例:真图作核的绳网结匹配
  • 你不一定全知道的四种Python装饰器实现详解
  • 类的类装饰器简单实现思路及案例
  • OpenCV-Python图形图像处理:自用的一些工具函数源代码
  • OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍
  • OpenCV-Python图形图像处理:split通道拆分和数组矩阵访问通道
  • 【Linux系统编程】快速查找errno错误码信息
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS 三角实现
  • echarts的各种常用效果展示
  • gitlab-ci配置详解(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript异步流程控制的前世今生
  • MySQL主从复制读写分离及奇怪的问题
  • Objective-C 中关联引用的概念
  • Rancher如何对接Ceph-RBD块存储
  • Sublime text 3 3103 注册码
  • swift基础之_对象 实例方法 对象方法。
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 猴子数据域名防封接口降低小说被封的风险
  • 机器学习中为什么要做归一化normalization
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开源地图数据可视化库——mapnik
  • 思考 CSS 架构
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 线性表及其算法(java实现)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Python 之网络式编程
  • Spring第一个helloWorld
  • 移动端高清、多屏适配方案
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​第20课 在Android Native开发中加入新的C++类
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (12)Hive调优——count distinct去重优化
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (175)FPGA门控时钟技术
  • (C#)一个最简单的链表类
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *Django中的Ajax 纯js的书写样式1
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .htaccess配置常用技巧