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

机器视觉学习-day04-形态学变换

1 形态学变化

形态学变换(Morphological Transformations)是一种基于形状的简单变换,它的处理对象通常是二值化后(白色前景,黑色背景)的图像。

形态学变换需要两个输入:

    源图像(二值化)
核(结构化元素)

输出为形态学变换后的图像:

    腐蚀(白色像素减少,黑色像素增多)
膨胀(白色像素增多,黑色像素减少)

上面两种形态学变换的处理结果是相反的,腐蚀会让较亮的元素变少,膨胀会让较亮的元素变多。

腐蚀:                                                                             膨胀:                                     

核实际上就是一个小区域,通常为3*3、5*5、7*7等
核结构分为:矩形结构、椭圆结构、十字形结构

代码运行步骤:图片输入→灰度化→二值化→形态操作→图片输出

代码中节点参数:

morph_op_type 形态学操作类型
erode 腐蚀
dilate 膨胀
shape 核的形状
MORPH_RECT 矩形
MORPH_ELLIPSE 椭圆
MORPH_CROSS 十字形
ksize 核尺寸

图片名称:1.png

1.1 腐蚀使用erode函数

import cv2
import numpy as npcv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('morph_image', 800, 600)
# 设置图片大小if __name__ == '__main__':# 1.图片输入path = '1.jpg'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY  # 正阈值)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 核的形状(3, 3)  # 核的尺寸)print(kernel)# 腐蚀使用erode函数,膨胀使用dilate函数# 返回值是形态处理之后的图像morph_image = cv2.erode(  # 腐蚀image_np_thresh,  # 二值化图像kernel  # 核)# 5. 图像输出cv2.imshow('morph_image', morph_image)cv2.waitKey(0)cv2.imwrite('erode.png', morph_image)

1.2 膨胀使用dilate函数

import cv2
import numpy as npcv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('morph_image', 800, 600)if __name__ == '__main__':# 1.图片输入path = 'image.jpg'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY  # 正阈值)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 核的形状(3, 3)  # 核的尺寸)print(kernel)# 腐蚀使用erode函数,膨胀使用dilate函数# 返回值是形态处理之后的图像morph_image = cv2.dilate(  # 膨胀image_np_thresh,  # 二值化图像kernel  # 核)# 5. 图像输出cv2.imshow('morph_image', morph_image)cv2.waitKey(0)cv2.imwrite('dilate.png', morph_image)

练习:

下面是星星图案,腐蚀掉空心星星,尽量让实心星星形状保持原样。

"""腐蚀掉空心星星,尽量让实心星星形状保持原样(颜色无所谓)。"""
import cv2cv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
# 创建一个名为'morph_image'的显示窗口
# cv2.WINDOW_NORMAL:表示窗口大小可调整(区别于固定大小的窗口)
cv2.resizeWindow('morph_image', 800, 600)
# 设置窗口大小为宽800像素,高600像素if __name__ == '__main__':# 1.图片输入path = 'xingxing.png'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY  # 正阈值)cv2.imshow('image_np_thresh', image_np_thresh)cv2.imwrite('image_np_thresh.png', image_np_thresh)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 核的形状(9, 9)  # 核的尺寸)print(kernel)""" 腐蚀:erode函数,膨胀:dilate函数腐蚀(白色像素减少,黑色像素增多)膨胀(白色像素增多,黑色像素减少)"""# 返回值是形态处理之后的图像"""这个代码中先膨胀,再腐蚀"""dilate = cv2.dilate(  # 膨胀image_np_thresh,  # 二值化图像kernel  # 核)# 腐蚀kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))erodede = cv2.erode(dilate,kernel)# 5. 图像输出cv2.imshow('morph_image', erodede)cv2.waitKey(0)cv2.imwrite('xingxing_eroded.png', erodede)

二值化后:

腐蚀再膨胀后的最终结果

http://www.dtcms.com/a/351656.html

相关文章:

  • Spring Boot 与传统 Spring:从 WAR 到可执行 JAR,颠覆性的部署哲学
  • MEMS陀螺定向短节与传统陀螺工具的区别?
  • 永磁同步电机无速度算法--传统脉振方波注入法(1)
  • 图片生成视频软件深度评测:浅谈视频音频提取技术
  • Boris FX Samplitude Suite 2025.0.0 音频录制/编辑和母带处理
  • 不增加 GPU,首 Token 延迟下降 50%|LLM 服务负载均衡的新实践
  • 如何基于阿里云OpenSearch LLM搭建智能客服平台
  • ssc37x平台的音频应用demo
  • 160.在 Vue3 中用 OpenLayers 解决国内 OpenStreetMap 地图加载不出来的问题
  • Mamba-HoME:面向3D医学影像分割的层次化专家混合新框架
  • 蓝思科技半年净利超11亿,蓝思成绩单怎么分析?
  • 为什么选择爱普生TG5032CFN温补晶振—可穿戴设备?
  • Pycharm
  • 前端漏洞(上)- JSONHijacking 漏洞
  • LangGraph-2-Demo
  • 基于goofys挂载s3到ubuntu, 没用s3fs因为它兼容性不太好
  • Stream流中的Map与flatMap的区别
  • 《从裸机到 GPU 共享:一步一步在 Kubernetes 上部署 NVIDIA GPU Operator + KAI Scheduler》
  • Python训练营打卡Day44-通道注意力(SE注意力)
  • 数字IC前端设计——前仿篇(VCS,DVE,Verdi)
  • 【Redis 进阶】-----哨兵 Sentinel(重点理解流程和原理)
  • 构建智能提示词工程师:LangGraph 的自动化提示词生成流程
  • 【远程软件VNC】经典远程软件VNC保姆级下载安装图文教程(附安装包)
  • STL——priority_queue的使用(快速入门详细)
  • 【硬件-笔试面试题-60】硬件/电子工程师,笔试面试题-60,(知识点:CAN总线通信原理)
  • 红黑树下探玄机:C++ setmultiset 的幕后之旅
  • Python在语料库建设中的应用:文本收集、数据清理与文件名管理
  • LeetCode刷题记录 | 长度最小的子数组 螺旋矩阵II
  • curl get post
  • GPMall 项目单机部署全流程GPMall:Redis、MariaDB、Kafka、Nginx 一步到位