OpenCV 图像形态学处理

news2025/1/18 11:06:48

        本文是OpenCV图像视觉入门之路的第11篇文章,本文详细的在图像形态学进行了图像处理,例如:腐蚀操作、膨胀操作、开闭运算、梯度运算、Top Hat Black Hat运算等操作。

OpenCV 图像形态学处理目录

1 腐蚀操作

2 膨胀操作

3 开闭运算

4 梯度运算

5 Top Hat Black Hat运算


1 腐蚀操作

        从下面代码中可以看到有三幅腐蚀程度不同的图,腐蚀越严重像素就越模糊

import cv2
import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
    kernel = np.ones((3, 3), np.uint8)
    erosion = cv2.erode(img1, kernel)
    cv2.imshow("img1", erosion)  # 显示叠加图像 dst

    img2 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
    kernel = np.ones((10, 10), np.uint8)
    erosion_1 = cv2.erode(img2, kernel)
    cv2.imshow('erosion_1', erosion_1)

    img3 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
    kernel = np.ones((30, 30), np.uint8)
    erosion_2 = cv2.erode(img3, kernel)
    cv2.imshow('erosion_2', erosion_2)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

binary_img = np.array([ [0, 0, 0, 0, 0],
                        [0,255,255,255,0],
                        [0,255,255,255,0],
                        [0,255,255,255,0],
                        [0, 0, 0, 0, 0]],np.uint8)
ones((3,3),np.uint8)

[[  0   0   0   0   0]
 [  0   0   0   0   0]
 [  0   0 255   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0   0]]

        通过上面的例子发现,经过3x3的kernel之后,最终只保留了中心的255像素,周边的255都变成了0。在进行腐蚀操作的时候,就是通过kernel大小的卷积在原图像上滑动,只有当kernel范围内的像素全为255时输出才为255,否则输出为0,所以kernel越大最终白色像素保留的会越少。

2 膨胀操作

        图像经过膨胀之后,白色像素的范围变大了。在做膨胀的时候,只要当kernel范围内的像素有255时输出就为255

3 开闭运算

        开运算其实就是先通过腐蚀操作后面再进行膨胀,闭运算和开运算恰好相反先通过膨胀操作后面再进行腐蚀

import cv2
import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
    # 定义kernel
    kernel = np.ones((3, 3), np.uint8)
    # 开运算
    open_img = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)
    # 闭运算
    close_img = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)


    cv2.imshow("open_img", open_img)  # 显示叠加图像 dst
    cv2.imshow("close_img", close_img)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

4 梯度运算

        梯度运算等价于膨胀运算-腐蚀运算 梯度运算主要是用来保留图像的轮廓

5 Top Hat Black Hat运算

Top Hat运算等价于原始图像 - 开运算,Black Hat运算等价于闭运算 - 原始图像

形态学Top-Hat变换是指形态学顶帽操作与黑帽操作,前者是计算源图像与开运算结果图之差,后者是计算闭运算结果与源图像之差。

形态学Top-Hat变换是常用的一种滤波手段,具有高通滤波的某部分特性,可实现在图像中检测出周围背景亮结构或周边背景暗结构。

顶帽操作常用于检测图像中的峰结构。

黑帽操作常用于检测图像中的波谷结构。

import cv2
import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
    # 定义kernel
    kernel = np.ones((3, 3), np.uint8)
    tophat_img = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel)
    blackhat_img = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel)


    cv2.imshow("tophat_img", tophat_img)  # 显示叠加图像 dst
    cv2.imshow("blackhat_img", blackhat_img)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

57.Isaac教程--定位监视器

定位监视器 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 检测异常系统状态并采取纠正措施有助于确保稳定的系统性能和与预期行为的最小偏差。 为此,Isaac SDK 提供了一个监控框架,可以搭载多种系统观察组件。 该框架目…

达芬奇18.1.2软件更新内容及安装教程(WinMac)

DaVinci Resolve v18.1.2是一款在同一个软件工具中,将剪辑、调色、视觉特效、动态图形和音频后期制作融于一身的解决方案!它采用美观新颖的界面设计,易学易用,能让新手用户快速上手操作,还能提供专业人士需要的强大性能…

【论文速递】WACV2023 - 循环相似注意力的小样本医学图像分割

【论文速递】WACV2023 - 循环相似注意力的小样本医学图像分割 【论文原文】:Few-shot Medical Image Segmentation with Cycle-resemblance Attention 获取地址:https://arxiv.org/pdf/2212.03967.pdf博主关键词: 小样本学习,语…

SpringCloud系列(九)[docker 篇] - Centos 7 下 Docker 的安装及基本操作指令

本篇文章将详细介绍 Centos 7 下 Docker 的安装以及一些基本操作指令. DockerDocker 的安装步骤Docker 基本操作指令Docker 的安装步骤 步骤一: 确保自己电脑的虚拟机联网并安装了 yum 工具, 如果没有安装 yum, 则执行下面的命令; yum install -y yum-utils \device-mapper-p…

力扣:多数元素(详解)

前言:本期是关于多数元素的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读 今天你c了吗? 题目: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元…

Python爬虫实战之哔哩哔哩二维码登录申请

前言 哈喽,好久不见了吧,各位新年好!博主春节也是比较忙的,没时间去写文章和"coding"。最近我们学校也是初九就开学了,所以更加没时间创作了🤣 言归正传,本次写这篇文章算是想要对我…

软件测试基础(五) 之 了解测试团队的组织架构

今天来了解一下软件测试团队的组织架构模式到底是什么样子。测试团队的组织架构模式的分类一个公司软件测试的组织架构,可能会决定你未来的成长空间,同时也决定了我们的工作模式到底是什么样子。现在测试行业内通常测试团队的组织架构主要分成两种&#…

亚马逊站内流量太少,如何拓展流量渠道增加产品销量?

近两年,经历了行业大洗牌之后,由于入驻平台卖家逐日增多,站内广告成本越来越高,想要抢占更多的站内流量变得愈发困难,一天出不了几单的情况也随处可见。因此,当站内流量的获取遭遇瓶颈,卖家想要…

阿里二面:RocketMQ 消费者拉取一批消息,其中部分消费失败了,偏移量怎样更新?

大家好,我是君哥。最近有读者参加面试时被问了一个问题,如果消费者拉取了一批消息,比如 100 条,第 100 条消息消费成功了,但是第 50 条消费失败,偏移量会怎样更新?就着这个问题,今天…

Pycharm出现‘Error loading package list:Connection refused: connect’问题

问题描述依次打开File->Settting窗口点击图中号弹出如下错误:Package错误窗口‘Error loading package list:Connection refused: connect 一段时间后继续弹出以下窗口:2.问题分析目前这个问题普遍说是由于网络配置原因引起的,在这之前&am…

【数据结构/C++】 树详解

目录树树的定义树的基本术语二叉树⼆叉树的种类满二叉树完全二叉树二叉树的性质二叉树的遍历方法前序遍历中序遍历后序遍历层序遍历二叉树的实现树 树的定义 树(Tree)是n(n≥0)个结点的有限集。n0时称为空树。在任意一颗非空树中…

[Effective Objective] 块与大中枢派发

为了解决多线程问题,苹果公司以全新的方式设计了多线程。核心就是“块”(block)与“大中枢派发”(Grand Central Dispatch, GCD)。 “块”是一种可在C、C及Objective-C代码中使用的“词法闭包”,借由此机制…

在一起多少天怎么设置?如何微信推送在一起多少天

马上情人节要到了,你和你的对象在一起多久了?两个人在恋爱中,会需要记录彼此在一起的每一天,特别是一些重要的纪念日比如100天纪念日,365天、或者520天纪念日。市面上有许多工具,可以帮我们记录这些重要的日…

指针空值nullptr(C++11)

在良好的C/C编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化:void TestPtr() { in…

【Docker 02】docker镜像和容器命令大全

对于入门学习者,更推荐的方式是通过官网的Reffrence手册,学习使用命令,不仅存在用法,选项参数的解释,还有用力example。 docker命令的基本语法结构: docker 子命令 [选项] [参数] 一、Docker基本命令 1.镜像有关 一批模板文件,不同的镜像可以包含的环境内容是不一样的,…

深入了解多线程原理

目录 背景知识: 什么是进程? 什么是线程? 线程与进程的区别: Thread类及常用方法: 循环打印的例子: start() 和 run() 的区别: 通过监视窗口查看线程: 创建线程: 1.继承 …

console控制台有sql语句输出但log文件中不输出sql解决方式

控制台可以输出sql,但是log文件中无sql输出,如何解决?把握两点就可以输出:第一点,mybatis 本身的logImpl配置这个参数是配置mybatis所使用的日志框架,取值范围如下:SLF4JLOG4J #表示使用LOG4J作…

提名倒计时! | 2022 龙蜥社区优秀贡献者

各位盆友们:2022 年,那些为龙蜥壮大做出杰出贡献的人们,包括开源背后的推动者、组织者、布道者、代码贡献者,让我们看到了热爱技术的力量!为此社区推出「2022 龙蜥社区优秀贡献者」活动。截至目前,距离报名…

CSAPP Malloc Lab

CSAPP Malloc Lab 在这个实验室中,您将为C程序编写一个动态存储分配器,即您自己版本的malloc、free和realloc例程,实现一个正确,高效和快速的分配器。本实验性能指标有两个方面,内存利用率和吞吐量,这两个…

fpga图像处理(基于camera的图像读取和显示)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 市面上目前很多的fpga开发板都有camera到lcd的显示demo。处理流程也是很相似的。一般的流程都是fpga首先初始化cmos,接着就是把数据从cmos读出来存储到sdram里面,显示模块再从sdra…