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

计算机视觉与模式识别实验1-2 图像的形态学操作

文章目录

    • 🧡🧡实验流程🧡🧡
      • 1.图像膨胀
      • 2.图像腐蚀
      • 3.膨胀与腐蚀的综合使用
      • 4.对下面二值图像的目标提取骨架,并分析骨架结构。
    • 🧡🧡全部代码🧡🧡

🧡🧡实验流程🧡🧡

1.图像膨胀

膨胀原理:设置一个3x3的矩阵,遍历每个像素点,该像素点的值等于以该像素点为中心的3*3范围内的最大值。由于是二值图像(要么0黑,要么255白),所以只要包含周围白(255)的部分,就变为白的。如下,字的外轮廓变粗。
在这里插入图片描述

2.图像腐蚀

腐蚀原理:与膨胀相反,设置一个3x3的矩阵,遍历每个像素点,该像素点的值等于以该像素点为中心的3*3范围内的最小值。由于是二值图像(要么0黑,要么255白),所以只要包含周围黑(0)的部分,就变为黑的。如下,腐蚀后,减少了一些毛刺,并且字体外形向内凹陷变瘦。
在这里插入图片描述

3.膨胀与腐蚀的综合使用

开操作原理:在上述腐蚀操作中,虽然能去除毛刺,但是会对原字体有影响(轮廓变细了),因此再补上膨胀操作,使得字体加粗,即进行先腐蚀后膨胀的操作。如下图,“开”字的毛刺去除了,同时字体轮廓粗细跟原来一样。
在这里插入图片描述
闭操作原理:与开操作相反,即进行先膨胀后腐蚀的操作。相当于先放大所有细节(这样子一些缺陷就可以闭合),然后腐蚀缩小到原字体粗细。如下,“闭”字几个封口闭合了。
在这里插入图片描述

4.对下面二值图像的目标提取骨架,并分析骨架结构。

在这里插入图片描述
梯度计算原理:膨胀图像-腐蚀图像,用大一圈的图像减去小一圈的图像正好就是边缘的信息
在这里插入图片描述

🧡🧡全部代码🧡🧡

import cv2
import numpy as np
import matplotlib.pyplot as pltdef cv_show(img):cv2.imshow('Image', img)cv2.waitKey(0)cv2.destroyAllWindows()"""2-1 膨胀操作
""" 
ori = cv2.imread('img/test1_dilate.png') # 注意不要有中文
kernel = np.ones((3, 3), dtype=np.uint8)
dilate = cv2.dilate(ori, kernel, iterations=1) # 1:迭代次数,也就是执行几次膨胀操作
res = np.hstack((ori, dilate)) # 拼接在一起
cv_show(res)"""2-2 腐蚀操作
"""
ori = cv2.imread('img/test1_erode.png') 
kernel = np.ones((3, 3), dtype=np.uint8)
erosion = cv2.erode(ori, kernel, iterations=1)
res = np.hstack((ori, erosion))
cv_show(res)"""2-3 开闭运算
"""
ori = cv2.imread('img/test1_open_close.png') 
kernel = np.ones((5, 5), dtype=np.uint8)opening = cv2.morphologyEx(ori, cv2.MORPH_OPEN, kernel, 1)
res = np.hstack((ori, opening))
cv_show(res)
closing = cv2.morphologyEx(ori, cv2.MORPH_CLOSE, kernel, 1)  # 有缺陷,填补缺陷
res = np.hstack((ori, closing))
cv_show(res)"""2-4 梯度计算 -- 提取骨架
"""
ori = cv2.imread('img/test1_morph.png') 
kernel = np.ones((3, 3), dtype=np.uint8)
gradient = cv2.morphologyEx(ori, cv2.MORPH_GRADIENT, kernel)
cv_show(gradient)

相关文章:

  • PostgreSQL入门教程
  • 【算法】位运算算法——消失的两个数字(困难)
  • FinalShell无法连接Linux
  • 【论文导读】Grid Graph Reduction for Efficient Shortest Pathfinding(2023 Access)
  • 64位和32位对C++ 对long类型的使用造成程序崩溃、内存泄漏问题。
  • 鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性
  • 【Python爬虫--scrapy+selenium框架】超详细的Python爬虫scrapy+selenium框架学习笔记(保姆级别的,非常详细)
  • HTTPS 原理技术
  • 专科生听劝 这种情况你就不要专转本了
  • 【QT】qcombox的信号使用小细节,activated(int)和currentIndexChanged(int)
  • 数据分析案例-在线食品订单数据可视化分析与建模分类
  • 【YashanDB知识库】自动选举配置错误引发的一系列问题
  • java实现地形dem产汇流流场数据提取解析
  • 《少年小鱼的魔法之旅——神奇的Python》,在悬疑和冒险中学会Python编程,Python启蒙入门的推荐书籍
  • 组合数计算方法(递推公式、乘法逆元)
  • Android Volley源码解析
  • Angular 响应式表单 基础例子
  • Angular6错误 Service: No provider for Renderer2
  • Git学习与使用心得(1)—— 初始化
  • interface和setter,getter
  • JavaScript对象详解
  • Laravel 菜鸟晋级之路
  • MySQL用户中的%到底包不包括localhost?
  • rc-form之最单纯情况
  • SegmentFault 2015 Top Rank
  • underscore源码剖析之整体架构
  • vuex 学习笔记 01
  • 阿里云Kubernetes容器服务上体验Knative
  • 彻底搞懂浏览器Event-loop
  • 计算机常识 - 收藏集 - 掘金
  • 京东美团研发面经
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 因为阿里,他们成了“杭漂”
  • 用简单代码看卷积组块发展
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 关于Android全面屏虚拟导航栏的适配总结
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​【已解决】npm install​卡主不动的情况
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ![CDATA[ ]] 是什么东东
  • #100天计划# 2013年9月29日
  • #1015 : KMP算法
  • #if和#ifdef区别
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (ibm)Java 语言的 XPath API
  • (Note)C++中的继承方式
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计ssm电影分享网站
  • (含笔试题)深度解析数据在内存中的存储
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos