OpenCV 09(形态学)

news2024/10/5 12:52:37

一、形态学

形态学指一系列处理图像 形状特征 的图像处理技术.

  • 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
  • 这些处理方法基本是对二进制图像进行处理, 即黑白图像
  • 卷积核决定着图像处理后的效果


形态学常用基本操作有:

    - 膨胀和腐蚀
    - 开运算
    - 闭运算
    - 顶帽
    - 黑帽

1.1 图像全局二值化 

二值化: 将图像的每个像素变成两种值, 比如0,  255

0和255:0是黑色,255是白色

01: 0是黑色,1是白色

- threshold(src, thresh, maxval, type[, dst])

  - src 最好是灰度图

  - thresh: 阈值

  - maxval: 最大值, 最大值不一定是255

  - type: 操作类型.常见操作类型如下:

 import cv2
  import numpy as np
  
  img = cv2.imread('./dog.jpeg')
  
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
  # 返回两个结果, 一个是阈值, 另一个是处理后的图片
  ret, dst = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY)
  
  cv2.imshow('dog', np.hstack((gray, dst)))
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()

1.2 自适应阈值二值化

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)**
 这种方法需要我们指定六个参数,返回值只有一个。

 • **Adaptive Method**- 指定计算阈值的方法。
 – **cv2.ADPTIVE_THRESH_MEAN_C**:阈值取自相邻区域的平均值
 – **cv2.ADPTIVE_THRESH_GAUSSIAN_C**:阈值取值相邻区域的加权和,权重为一个高斯窗口。 
 • **Block Size** - 邻域大小(用来计算阈值的区域大小)。
 • **C** - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。

# 因为光线问题, 全局二值化导致有部分地方看不见了.这时就需要自适应阈值二值化了.
import cv2
import numpy as np

img = cv2.imread('./math.png')

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 1920, 1080)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 自适应阈值二值化只返回一个值, 即二值化后的结果
dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)

cv2.imshow('img', np.hstack((gray, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

 

1.3  腐蚀操作

 腐蚀操作也是用卷积核扫描图像, 只不过腐蚀操作的卷积一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色. 

- 大部分时候腐蚀操作使用的都是全为1的卷积核.

- erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

  - iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀操作执行的次数越多, 腐蚀效果越明显

import cv2
import numpy as np

img = cv2.imread('./msb.png')

kernel = np.ones((3, 3), np.uint8)

dst = cv2.erode(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

1.4 获取形态学卷积核

- opencv提供了获取卷积核的api.不需要我们手工创建卷积核.
- getStructuringElement(shape, ksize[, anchor])

  - shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
    - MORPH_RECT 卷积核中的1是矩形, 常用.
    - MORPH_ELLIPSE 椭圆
    - MORPH_CROSS 十字

import cv2
import numpy as np

img = cv2.imread('./j.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.erode(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

1.5 膨胀操作

膨胀是腐蚀的相反操作, 基本原理是只要保证卷积核的锚点是非0值, 周边无论是0还是非0值, 都变成非0值.

- dilate(img, kernel, iterations=1)

import cv2
import numpy as np

img = cv2.imread('./j.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

 

1.6 开运算

 开运算和闭运算都是腐蚀和膨胀的基本应用. 

- 开运算 = 腐蚀 + 膨胀
- morphologyEx(img, MORPH_OPEN, kernel)

  - MORPH_OPEN 表示形态学的开运算
  - kernel 如果噪点比较多, 会选择大一点的kernel, 如果噪点比较小, 可以选择小点的kernel

import cv2
import numpy as np

img = cv2.imread('./dotj.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 腐蚀
# dst = cv2.erode(img, kernel, iterations=2)

# # 膨胀
# dst = cv2.dilate(dst, kernel, iterations=2)

# 直接调用opencv提供的开运算api
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

1.7 闭运算

- 闭运算 = 膨胀 + 腐蚀

import cv2
import numpy as np

img = cv2.imread('./dotinj.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

1.8 形态学梯度

- 梯度 = 原图  -  腐蚀
- 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.

import cv2
import numpy as np

img = cv2.imread('./j.png')

# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

1.9 顶帽运算

- 顶帽 = 原图 - 开运算
- 开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.

import cv2
import numpy as np

img = cv2.imread('./tophat.png')

# 注意调整kernel以保留小图形
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))

dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

 

1.10 黑帽操作

- 黑帽 = 原图 - 闭运算
- 闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点.

import cv2
import numpy as np

img = cv2.imread('./dotinj.png')

# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

JUC编程中锁引发的“见解”

JUC编程中锁引发的“见解” 一大早就在想锁是干嘛的?什么情况下要用锁?想了很多,下面的所有表述都是就是我的思考流程,欢迎所有人一起讨论、更正。 文章目录 JUC编程中锁引发的“见解”1、什么是JUC编程?2、JUC编程中什么情况下需…

C/C++之链表的建立

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.头插 1.1简介 1.2代码实现头插 …

二维数组前缀和(JAVA)

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 暴力 双层for循环,遍历子矩阵。 前缀和算法: class NumMatrix {private int sum[][];private int matrix[][];public NumMatrix(int[][] matrix) {this.matrixmatrix;int row…

AI 帮我写代码——Amazon CodeWhisperer 初体验

文章作者:游凯超 人工智能的突破和变革正在深刻地改变我们的生活。从智能手机到自动驾驶汽车,AI 的应用已经深入到我们生活的方方面面。而在编程领域,AI 的崭新尝试正在开启一场革命。Amazon CodeWhisperer,作为亚马逊云科技的一款…

【高德地图】 覆盖物/画点/画折线/画多边形/画矩形/画圆

官方示例 https://lbs.amap.com/demo/javascript-api/example/mouse-operate-map/mouse-draw-overlayers <!doctype html> <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content…

07_瑞萨GUI(LVGL)移植实战教程之LVGL对接EC11旋转编码器驱动

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 7. LVGL对接EC11旋转编码器驱动 本次实验我们向LVGL库中对接EC11旋转编码器驱动&#xff0c;让我们能通过EC11旋转编码器操作UI。 7.1 复制工程 上次实验得出的工…

一文读懂Swin-Transformer

系列文章目录 记录CV领域大模型的学习历程&#xff0c;欢迎大家一起讨论&#xff0c;互相学习。 ViT,DETR(一),DETR(二)DETR(三) 文章目录 系列文章目录前言一、整体框架1.Patch Embedding2.Patch Merging3.Swin Transformer Block3.1 Window Partition/Reverse3.2 Window-MSA…

C#__文件操作之FileInfo和DirectoryInfo

// 代码&#xff08;含注释&#xff09; class Program{static void Main(string[] args){// FileInfo 文件操作FileInfo myFile new FileInfo("D:\C#编程\文件操作之FileInfo和DirectoryInfo\TextFile1.txt");// 实例方法// myFile.CopyTo("D:\C#编程\文件操作…

空中跳一跳

欢迎来到程序小院 空中跳一跳 玩法&#xff1a; 跳一跳长按鼠标左键&#xff0c;松开鼠标进行跳跃&#xff0c;跳到下一个格子中&#xff0c;进行分数统计&#xff0c;三次生命机会&#xff0c;格子中也会有爱心出现&#xff0c;吃掉安心增加一次生命哦^^。开始游戏https://ww…

第19章 并发与竞争实验(iTOP-RK3568开发板驱动开发指南 )

在前面章节的学习中&#xff0c;相信大家已经对用户空间与内核空间数据传递进行了实验&#xff0c;假如要传递的数据被存放在了全局变量&#xff0c;该数据就可以作为共享资源被多个任务共同读写&#xff0c;从而造成数据的错误传输&#xff0c;多个程序同时访问一个共享资源产…

取个好名,是一生中极为重要之事

我们每十年一大运&#xff0c;五年一小运。每交次大运时&#xff0c;就会改变一次你身边的一切环境。每个大运&#xff0c;都会把你带入不同的风景&#xff0c;人生想要须尽欢&#xff0c;就不要太在意外在的一切&#xff0c;永远向内求。有志同道合的人就一起上路&#xff0c;…

《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》中文翻译

《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》- 思维树&#xff1a;用大型语言模型有意识地解决问题 论文信息摘要1. 介绍2. 背景3. 思想树&#xff1a;用 LM 有意识地解决问题4. 实验4.1 24 人游戏4.2 创意写作4.3 迷你填字游戏 5. 相关工作6…

语音芯片NRK3302 在按摩仪上的应用

在当今生活节奏快&#xff0c;生活压力大的现代社会。按摩仪已逐渐成为人们生活中不可或缺的日常用品&#xff0c;人们需要一个能够随时放松身体的工具。智能按摩仪应运而生&#xff0c;在按摩仪中加入语音芯片&#xff0c;让按摩仪变得更加智能&#xff0c;使用起来更加便利化…

私有云不是真正的云计算!

大数据产业创新服务媒体 ——聚焦数据 改变商业 中国云计算遇到困境&#xff0c;IaaS层面&#xff0c;阿里云、腾讯云等增长乏力&#xff1b;SaaS没有发展起来。反观美国&#xff0c;整个云计算蓬勃发展&#xff0c;AWS、微软云、谷歌云体量更大&#xff0c;增速却不低&#x…

YOLO目标检测——工地安全帽识别检测数据集+已标注yolo格式标签下载分享

实际项目应用&#xff1a;目标检测工地安全帽识别检测数据集在工地安全监测、工地管理、安全培训和教育、违规检测和预警以及安全统计和分析等领域都有着广泛的应用。通过准确识别和检测工人是否佩戴安全帽&#xff0c;可以帮助提高工地的安全性和管理效率&#xff0c;减少事故…

通过finalshell快速在ubuntu上安装jdk1.8

这篇文章主要介绍一下怎么通过finalshell连接ubuntu&#xff0c;然后在ubuntu上安装jdk1.8&#xff0c;让不熟悉linux操作系统的童鞋也能快速地完成安装。 目录 一、准备一台虚拟机 二、安装finalshell远程连接工具 三、获取ubuntu虚拟机的ip地址 四、通过finalshell连接u…

Spring以及SpringBoot/SpringCloud注解

一、SpringBoot/Spring 1、SpringBootApplication 包含Configuration、EnableAutoConfiguration、ComponentScan通常在主类上 其中ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文&#xff0c;如果扫描到有Component Controller Service等这些注解的…

vscode配置conda环境

vscode配置conda环境 写在最前面安装vscodeanaconda3 配置vscode中文vscode配置anaconda环境步骤 新建.ipynb项目 写在最前面 之前一直是jupyter notebookpycharm 帮朋友配置环境的时候发现&#xff1a;vscode结合了cell自动补齐&#xff0c;狠狠心动了 于是安装配置vscode 参…

数据结构和算法(3):列表

列表是一种线性数据结构&#xff0c;它允许在其中存储多个元素&#xff0c;并且可以动态地添加或删除元素。 循秩访问 可通过重载下标操作符&#xff0c;实现寻秩访问 template <typename T> // assert: 0 < r < size T List<T>::operator[](Rank r) cons…

easyrecovery 2023年最好用的数据恢复软件

EasyRecovery是一款操作简单、功能强大数据恢复软件,通过easyrecovery可以从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件、图片、音频、视频等数据文件。 easyrecovery数据恢复软件&#xff0c;是国内顶尖工作室的技术杰作。它是一个硬盘数据恢复工具&…