百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

OpenCV 形态学处理:腐蚀膨胀、梯度运算、礼帽黑帽

bigegpt 2024-09-01 15:22 5 浏览

各位同学好,今天和大家分享一下图像的形态学处理方法。内容有:

膨胀腐蚀、开运算和闭运算、梯度运算、礼帽和黑帽

(1)腐蚀:cv2.erode();(2)膨胀:cv2.dilate();(3)形态学函数:cv2.morphologyEx();

那我们开始吧。


正文

我们先导入接下来操作需要的库文件和图像数据

import cv2
import numpy as np
# 指定图片所在文件夹
filepath = 'C:\\...\\img\\changed'
# 获取文件夹中的某张图
img = cv2.imread(filepath+'\\wiseman.jpg')
# 显示图片
cv2.imshow('wiseman',img)
cv2.waitKey(0) # 设置图片不会自动消失
cv2.destroyAllWindows()  # 任意键关闭图像

1. 腐蚀操作

腐蚀操作,一般处理二值化图像,黑白图像,白色区域减少。简单理解为,卷积核在图像上移动的过程中,如果卷积核所框住的部分全为黑或全为白,图像不变;如果既有黑又有白,那么按一定策略将白变黑。

腐蚀函数: cv2.erode(img, kernel, iterations)

img为输入的图像。kernel为卷积核大小,卷积核越小,腐蚀越慢,需要的迭代次数越多。

iterations为迭代次数。iterations=2,表示在完成第一次腐蚀的结果图像上再进行腐蚀。

# 5*5的全1卷积核;uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255
kernel = np.ones((5,5),np.uint8)
# 参数为:输入图像,卷积核,迭代次数=1
img2 = cv2.erode(img, kernel, iterations=1)
# 显示图片
cv2.imshow('wiseman2',img2)
cv2.waitKey(0) 
cv2.destroyAllWindows()  

下图对比


2. 膨胀操作

膨胀操作,一般处理二值化图像,白色区域增大。和腐蚀相反,卷积核在图像上移动的过程中,如果既有黑又有白,那么按一定策略将黑变白。

腐蚀函数: cv2.dilate(img, kernel, iterations)

参数同上,img为输入的图像。kernel为卷积核大小。iterations为迭代次数。

#(2)膨胀操作
# 设置卷积核3*3全1
kernel = np.ones((3,3),np.uint8)
# 传入图像,卷积核,迭代次数
img3 = cv2.dilate(img, kernel, iterations=1)
# 显示图片
cv2.imshow('wiseman3',img3)
cv2.waitKey(0) 
cv2.destroyAllWindows()  

下图所示


3. 形态学函数

cv2.morphologyEx(img, op, kernel)

img代表输入图像;kernel代表卷积核;op代表形态学处理参数,如下

  • MORPH_ERODE: 腐蚀(黑变多),与腐蚀函数cv2.erode效果相同
  • MORPH_DILATE: 膨胀(白变多),与膨胀函数cv2.dilate效果相同
  • MORPH_OPEN: 开运算,先腐蚀后膨胀。平滑边界,去除凸起,移除小白点
  • MORPH_CLOSE: 闭运算,先膨胀再腐蚀。填充图像内部小黑洞,填充图像凹陷
  • MORPH_GRADIENT: 梯度计算,用膨胀图减腐蚀图。获得图像的边缘轮廓
  • MORPH_TOPHAT: 礼帽,用原图像减去开运算后的图像。获得原图像中比周围亮的区域
  • MORPH_BLACKHAT: 黑帽,闭运算图像减去原图像。获取原图像中比周围暗的区域

4. 开运算

先腐蚀后膨胀,白色区域先变小后扩张,平滑边界(去掉凸起)、移除白点

cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

#(3)开运算:先腐蚀后膨胀
# 定义卷积核
kernel = np.ones((3,3),np.uint8)
# 形态学函数:图像,开运算,卷积核
img4 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 显示图片
cv2.imshow('opening',img4)
cv2.waitKey(0) 
cv2.destroyAllWindows()  

效果图在下面。

5. 闭运算

先膨胀后腐蚀,白色区域先变大后缩小,闭运算用于填充图像内部的小黑洞、填充图像的凹陷等,排除小黑洞,连接被误分为许多小块的对象

#(4)闭运算:先膨胀后腐蚀
# 定义卷积核
kernel = np.ones((3,3),np.uint8)
# 形态学函数:图像,闭运算,卷积核
img4 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 显示图片
cv2.imshow('closing',img4)
cv2.waitKey(0) 
cv2.destroyAllWindows()  

第一张为原图,第二张为开运算,第三张为闭运算

6. 梯度计算

梯度图,用膨胀图减腐蚀图。可以用于获得图像中物体的轮廓,可以突出团块的边缘,保留物体的边缘轮廓。

# ==2== 梯度运算,膨胀图像减去腐蚀图像,得到轮廓信息
# 卷积核
kernel = np.ones((3,3),np.uint8)
# 形态学处理函数,输入图像,梯度计算参数,卷积核
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 绘图,查看边界信息
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destoryAllWindows()

下图第一张是膨胀图像,第二张是腐蚀图像,第三张是梯度图

7. 礼帽

礼帽 = 原始输入 - 开运算结果

可以用于获得原图像中比周围亮的区域,去除白色重叠部分

# ==1== 礼帽
# 获取图像
img = cv2.imread(filepath+'\\wiseman.jpg')
# 卷积核
kernel = np.ones((8,8),np.uint8)
# 形态学处理函数,输入图像,梯度计算参数,卷积核
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 绘图,查看边界信息
cv2.imshow('tophat',tophat)
cv2.waitKey(0)
cv2.destoryAllWindows()

第一张为原图,第二张为开运算,第三张是礼帽

8. 黑帽

黑帽 = 闭运算-原始输入

可以用于获取原图像中比周围暗的区域,保留白色重叠部分

# ==2== 黑帽
# 获取图像
img = cv2.imread(filepath+'\\wiseman.jpg')
# 卷积核
kernel = np.ones((8,8),np.uint8)
# 形态学处理函数,输入图像,梯度计算参数,卷积核
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
# 绘图,查看边界信息
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
cv2.destoryAllWindows()

第一张是闭运算,第二张是原图,第三张是黑帽

最后有惊喜(别错过哦)

跻身大厂是每一个程序员的梦想,也希望有机会可以大放异彩,成绩斐然。不过,不积跬步无以至千里,理想和现实的距离是需要努力来不断缩短的。

所以这里我准备了一些礼包,希望能够帮助到各位小伙伴。

★礼包1

如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者评论区留言,我会拉你进学习交流群,我们一起交流学习,报团打卡,群内更有众多福利等你来解锁哟,赶快加入我们吧!

★礼包2

?Python全套电子书,200本总共6个G电子书资料,囊括Python各大领域。

?Python练手项目,包括爬虫、数据分析、机器学习、人工智能、小游戏开发。

相关推荐

LangChain4j如何自定义文档转换器实现数据清洗?

LangChain4j提供了3种RAG(Retrieval-AugmentedGeneration,检索增强生成)实现,我们通常在原生或高级的RAG实现中,要对数据进行清洗,也就是将外接...

Java 8 Stream API 详解(java stream.)

Java8StreamAPI详解一、概述在Java8中,StreamAPI是一个重要的新特性。它为处理集合(如List、Set等)中的元素提供了一种高效且富有表现力的方式。Str...

Java修炼终极指南:185 使用 Stream 过滤嵌套集合

这是面试中的一个经典问题,通常从一个模型开始,如下所示(我们假设集合是一个List):publicclassAuthor{privatefinalStringname;pri...

java8的stream使用小示例(java stream())

据JetBrains发布的2021年开发者生态系统调查,Java8在java使用的版本中仍然是当前最流行的版本。72%的专业开发人员使用Java8作为其在java开发中主要编程语言版本。现...

Node.js Stream - 实战篇(node.js in action)

本文转自“美团点评技术团队”http://tech.meituan.com/stream-in-action.html背景前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介...

Java Stream:集合处理的api(java 集合操作)

JavaStream流:高效集合处理的函数式编程利器一、什么是JavaStream?Java8引入的StreamAPI是一套用于处理集合数据的流式编程接口,通过函数式风格(无副作用的...

去除 List 中的重复元素,你知道几种实现方法?

去除List中重复元素,这在实际编程或面试中经常遇到,每个人都有习惯的写法吧,这里抛砖引玉,汇总了一些实现方案,开拓思路。准备数据假设数组中有10个数据,可能有重复,需要将重复的数据从数组中去掉。pu...

Java开发者必看!Stream流式编程10个爆款技巧,让你代码优雅飞起

为什么你的Java代码总像拧巴的麻绳?掌握这10个Stream实战技巧,代码效率与优雅度将产生质的飞跃。以下案例均来自真实电商系统场景,带你感受流式编程的降维打击!一、过滤与映射组合拳(Filter...

leetcode每日一题之存在重复元素(存在重复元素 iii)

题:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。比如:输入:[1,2,3,1]输出:true...

告别for循环!揭秘Stream API如何让你的代码简洁度提升300%

一、当传统循环遇上现代需求真实场景复现:某电商平台需要处理10万条订单数据,要求:筛选出金额>500的订单提取用户ID并去重统计VIP用户数量传统实现方案://常规写法Set<Long...

Java中List去重的N种方法:从基础到优雅

Java中List去重的N种方法:从基础到优雅在日常的Java开发中,我们经常会遇到需要对List集合去重的情况。无论是为了清理重复的数据,还是为了优化算法性能,掌握多种去重方式都是一项非常实用的技能...

Java Stream流没用过?常用高频方法

概念Stream流是Java8添加的以一种链式调用的方法处理数据,主要侧重于计算。具有以下相关特点代码简洁链式调用Stream常用方法1.将数组变为当作List操作String[]strArr=...

核医学专业名词索引(M-R)(核医学重点归纳)

M吗啡(morphia)埋藏式心律转复除颤器(implantablecardioverterdefibrillator,ICD)麦角骨化醇(VD2,calciferol)脉冲堆积(pulsepi...

CodeMeter 新版发布(codesigner下载)

威步于2022年8月4日发布CodeMeter7.50及CodeMeter软件保护套装11.10,以下为新版内容。CodeMeterRuntime7.50StreamingSIMDExten...

世界上最小的五轴铣床Pocket NC(最小的五轴加工中心)

PocketNC,由MIT学生研制,还有说法是这款产品的设计者是来自美国蒙大拿州的一对极客夫妻。目前主要有两款产品:PocketNCV2-50,9000美元;PocketNCV2-10,60...