热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonOpenCV中文指南:详解Python中调用OpenCV的方法与技巧

本文详细介绍了在Python中使用OpenCV进行图像处理的各种方法和技巧,重点讲解了腐蚀(erode)和膨胀(dilate)操作,以及开运算和闭运算的应用。腐蚀操作可以去除前景物体的边缘部分,而膨胀操作则可以扩展前景物体的边界。开运算和闭运算则是结合这两种基本操作,用于消除图像中的噪声和填充空洞,提高图像处理的效果。通过具体的代码示例和实际应用案例,读者可以深入理解这些技术在图像处理中的重要作用。


原文链接: opencv图像的腐蚀(erode )和膨胀)开运算及闭运算


OpenCV---开合操作-山上有风景-博客园


腐蚀:


腐蚀操作会腐蚀前景物体的边缘。 原理是卷积核沿图像滑动,如果卷积对应的原图像像素值均为1,则中心元素保持原始值,否则为0。


效果是,接近前景的像素被腐蚀为0,前景物体变小,图像的白色区域减少,对消除白噪声有用,能够分离两个相连的物体。


膨胀:


与腐蚀相反,如果卷积核中有一个的值为1,则中心元素值为1。 此操作会增加前景中的白色区域,通常在去除噪波时会发生腐蚀,然后膨胀。 腐蚀过程会减小前景,并使用膨胀操作将前景转换回。 膨胀也可以连接相互分开的物体。


1.)边缘检测


结构元素可以使用矩形/椭圆/十字形。 cv2.getStructuringElement ) )可以生成各种形状的结构元素,包括:


kernel=cv2.getstructuringelement (cv2.morph _ rect,(5,5 ) ) #矩形结构


kernel=cv2.getstructuringelement (cv2.morph _ ellipse,(5,5 ) ) #椭圆结构


kernel=cv2.getstructuringelement (cv2.morph _ cross,(5,5 ) ) #十字结构


img=cv2.imread('j.BMP ',0 ) ) ) ) ) ) ) ) ) ) ) )。


kernel=NP.ones ((5,5 ),np.uint8) )。


erosion=cv2.erode(img,kernel ) #腐蚀极限是反复运算次数


膨胀与腐蚀相反,取局部最大值,效果是使图像“胖”:


dilation=cv2.dilate(img,kernel ) #膨胀#! /usr/ssdpd/env python


# encoding: utf-8


导入cv2


导入编号为NP


image=cv2.imread('2.jpg ',0 );


制作33的结构元素


element=cv2.getstructuringelement (cv2.morph _ rect,(3,3 ) )


dilate=cv2.dilate(image,element ) )。


erode=cv2.erode(image,element ) )。


#减去两幅图像得到边缘。 第一个参数是膨胀后的图像,第二个参数是蚀刻后的图像


result=cv2.ABSdiff(dilate,erode );


#上面得到的结果为灰度,已进行二值化,以便更清晰地观察


retval,result=cv2.Threshold(result,40,255,cv2.THRESH_BINARY );


#反转,即按2值图每个像素反转


result=cv2.bitwise_not(result;


#显示图像


CV2.imshow('result ',result );


cv2.waitkey(0) ) ) ) ) ) ) ) ) cv2.waitkey(0) ) ) ) ) cv2.waitkey(0) )。


cv2.destroyAllWindows (


腐蚀与膨胀是数学形态学名词,用于图像处理称为图像二值形态学。


形态学主要是为了获取物体的拓扑和结构信息,通过物体与结构元素相互作用的某些运算,得到物体更本质的形态。 形态学应用于图像处理时,其主要作用是利用蚀刻和膨胀运算等形态学基本运算,对图像进行观察和处理,达到改善图像质量的目的; 描述和定义图像的各种几何参数和特征。


二值图像的腐蚀和膨胀操作具体如下。


图像腐蚀(erode ) )。


蚀刻的具体操作:一个结构元素(也称为操作数矩阵)一般为33大小。 也可以看作是卷积模板。 这些差异是卷积模板基于算术运算,而结构要素基于集合运算。 扫描图像的各像素(有关图像边缘的处理将在以下详细分析),用操作数矩阵扫描图像的各像素,制作与操作数矩阵的各像素复盖的像素


另一方面,如果“膨胀”(dilate )操作相反,且全部为0,则像素中的该像素为0,反之为1。


腐蚀的作用是消除物体的边界点,缩小目标,这一点从操作过程中可以明显看出,物体边界一定有像素值为0和1,腐蚀操作后与这1相邻的像素点都为0,因此腐蚀操作消除了小的无意义物体,使边界向内部收缩


相反,膨胀(dilate )的作用当然是增大目标,填塞体内细小的空洞,使物体边界光滑,边界向外部扩展。


运气是最初腐蚀(erode )然后膨胀)的过程,可以去除图像上的细小噪声并平滑物体边界


闭合运算是先膨胀(dilate )后腐蚀) e

rode)的过程,可以填充物体内细小的空洞,并平滑物体边界

通常,由于噪声的影响,图象在阈值化后所得到边界往往是很不平滑的,物体区域具有一些噪声孔,背景区域上散布着一些小的噪声物体。连续的开和闭运算可以有效地改善这种情况。有时需要经过多次腐蚀之后再加上相同次数的膨胀,才可以产生比较好的效果。

腐蚀操作会去掉物体的边缘点,细小物体所有的点都会被认为是边缘点,因此会整个被删去。再做膨胀时,留下来的大物体会变回原来的大小,而被删除的小物体则永远消失了。

膨胀操作会使物体的边界向外扩张,如果物体内部存在小空洞的话,经过膨胀操作这些洞将被补上,因而不再是边界了。再进行腐蚀操作时,外部边界将变回原来的样子,而这些内部空洞则永远消失了。

对上面腐蚀和膨胀操作更细致的分析(主要谈论涉及图像边缘的腐蚀和膨胀运算)

注:结构元素在扫描图像中的每个像素时,结构元素的邻域有部分会在图像外面。比如当结构元素扫描图像上方第一行像素值(这里默认结构元素为3×3),结构元素会有部分在图像的外面,此时,为了有效处理边界像素,进行形态学运算的函数通常都会给出超出图像、未指定数值的像素指定一个数值,这样就类似于函数给图像填充了额外的行和列。对于膨胀和腐蚀操作,它们对像素进行填充的值是不同的。规则如下:

腐蚀和膨胀填充图像规则表

规 则

腐蚀 超出图像边界的像素值定义为该数据类型允许的最大值,对于二进制图像,这些像素值设置为1;对于灰度图像,unit8类型的最小值也为255。

膨胀 超出图像边界的像素值定义为该数据类型允许的最小值,对于二进制图像,这些像素值设置为0;对于灰度图像,unit8类型的最小值也为0。

通过对膨胀操作使用最小值填充和对腐蚀操作使用最大值填充,可以有效地消除边界效应(输出图像靠近边界处的区域与图像其它部分不连续)。否则,如果腐蚀操作使用最小值进行填充,则进行腐蚀操作后,输出图像会围绕着一个黑色边框。(此处根据腐蚀和膨胀的具体操作过程应该不难理解,因为当图像边缘都是白色时也就是像素值全为1,此时如果图像边缘外面的像素值填充为最小值,如果二值图像的话则像素值为0,根据腐蚀操作,相与后肯定为0,这时图像边缘处便会成为黑色)

结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的邻域像素在进行膨胀或腐蚀操作时是否需要参与计算。三维或非平面的结构元素使用0,1定义结构元素在x和y平面上的范围,第三维z定义高度。

开操作(先腐蚀后膨胀)

特点:会消除一些为1的白色噪点 ,消除噪点,去除小的干扰块,而不影响原来的图像def open_demo(image):

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

for i in range(1000):  #为灰度图像加一些噪点

h = np.random.random_integers(0,gray.shape[0]-1)

w = np.random.random_integers(0, gray.shape[1]-1)

val = np.random.random_integers(0, 255)

gray[h,w] = camp(gray[h,w],val)

ret,ssdpdary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)  #生成二值化图像

cv.imshow("ssdpdary",ssdpdary)

kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))

ssdpdary = cv.morphologyEx(ssdpdary,cv.MORPH_OPEN,kernel)  #开操作,先腐蚀后膨胀,会消除一些为1的白色噪点

三:利用开操作完成的任务

(一)提取水平垂直线def open_demo(image):

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

ret,ssdpdary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)

cv.imshow("ssdpdary",ssdpdary)

kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))  #修改内核为(15,1)可以提起横线

ssdpdary = cv.morphologyEx(ssdpdary,cv.MORPH_OPEN,kernel)

cv.imshow("open_demo",ssdpdary)

(二)消除干扰线def open_demo(image):

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

ret,ssdpdary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)

kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #因为干扰线很细,小于我们想要的字母,先腐蚀后膨胀对字母无影响,但是对于细线在腐蚀的时候就处理掉了

ssdpdary = cv.morphologyEx(ssdpdary,cv.MORPH_OPEN,kernel)

(三)提取满足要求的形状

getStructuringElement我们设置的内核形状为矩形,是可以设置其他形状

矩形:MORPH_RECT;

十字形结构:MORPH_CORSS;

椭圆形:MORPH_ELLIPSE;def open_demo(image):

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

ret,ssdpdary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)

cv.imshow("ssdpdary",ssdpdary)

kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))

ssdpdary = cv.morphologyEx(ssdpdary,cv.MORPH_OPEN,kernel)

cv.imshow("open_demo",ssdpdary)

二:闭操作(先膨胀后腐蚀)

特点:可以填充闭合区域def close_demo(image):

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

ret,ssdpdary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)

cv.imshow("ssdpdary",ssdpdary)

kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))

ssdpdary = cv.morphologyEx(ssdpdary,cv.MORPH_CLOSE,kernel)

cv.imshow("close_demo",ssdpdary)

————————————————

版权声明:本文为CSDN博主「jsjyedqt」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/computer_yedqt/article/details/21819099


推荐阅读
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • Jedis接口分类详解与应用指南
    本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 深入解析:Explain命令的应用与字段详解
    深入解析:Explain命令的应用与字段详解 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
author-avatar
天使骨头_799
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有