OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算

简介: 1. 形态学OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。

1. 形态学

OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。


通过对图像进行形态学操作可以实现一些重要的图像处理任务,比如去除噪声、分离图像中的对象、填充图像中的空洞、改变图像的形状、寻找图像中的轮廓等等。在OpenCV中,形态学操作通常采用二值图像进行处理,它可以通过C++或Python编程实现具体的形态学算法


2. 常用接口

在对图片进行相关操作之前,我们首先要先将彩色图片转变为灰度图像,方便图像的二值化。

2.1 cvtColor()

转换颜色通道的API

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

第二个参数为BGR图像转到灰度图像。


2.2 图像二值化

threshod()

该API能将灰度图像按照设定的阈值,将图像二值化。


ret ,dst = cv2.threshod( img, thresh, maxVal, type)

img:图像,最好是灰度图。

thresh:阈值(低于阈值为0,高于阈值的部分为maxVal)

maxVal:超过阈值的替换成maxVal

返回值有两个,第一个是使用的阈值,第二个是输出后的图像


type:


CV2.THRESH_BINARY

CV2.THRESH_BINARY_INV

CV2.THRESH_TRUNC

CV2.THRESH_TOZERO

CV2.THRESH_TOZERO_INV


4092c7e3a9ed4a13987d22c7c40b8793.png

上图显示了不同参数下,二值化的不同图像,第一个图为原始图像,后面的为不同的规则。

下列示例将一个灰度图分别以阈值100,180进行二值化。

import cv2
import numpy as np
img = cv2.imread('./image/lena_small.png')
# 将图片转换为灰度图
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将阈值设为100,180
ret, img2 = cv2.threshold(img1, 100, 255, cv2.THRESH_BINARY)
ret1, img3 = cv2.threshold(img1, 180, 255, cv2.THRESH_BINARY)
cv2.imshow('orgin_img', img1)
cv2.imshow('img_100', img2)
cv2.imshow('img_180', img3)
cv2.waitKey(0)

2207dac79c6446408e93a7678f760396.png

自适应阈值二值化

有时候由于光照不均匀以及阴影的存在,有可能导致阴影部分的白色会被二值化为黑色,因此只有一个阈值的缺陷就暴露了出来。


dea1d1a002a64913a64272cda050e390.png

用全局二值化,将阈值设置为180时,由于阴影的存在,会将阴影部分黑化,导致显示不完全。因次提出了自适应二值化的方法。


adaptiveThreshod()

dst = cv2.adaptiveThreshod(img, maxVal, adaptiveMethod, Type, blockSize, C)

img:需要二值化的图像(最好是灰度图

maxVal:超过阈值的像素设置成maxVal

adaptiveMethod:见下图

Type:为全局二值化的Type

blockSize:临近区域的大小,填奇数

C:常量,从计算的平均值或加权平均值中减去,一般为0

2d0cffac64344e78820347d35881fad9.png

2.3 腐蚀与膨胀

腐蚀就是将一个图片关键部分“缩小“,膨胀将一个图形的关键部分放大。卷积核通常为全1的奇数矩阵。



df0b532c220d4b5aa65532786232d389.png

b2036d0a9e1a44f4b591faaa4a912668.png

erode()

原始图像中的一个像素无论是1还是0,只有当内核中的所用像素都是1时,结果才是1,否则结果就是0

dst = cv2.erode(img, kenel, iterations = 1)

img:要腐蚀的图像

kenel:卷积核,全1的矩阵

iterations:执行次数,默认为1次


51e3ca2a573041a187aa8312a05bf005.png

getStructuringElement()

便捷API,帮助我们获得指定大小的卷积核

kernel = cv2.getStructuringElement(type, Size)

Type:MORPH_RECT(矩形);MORPH_ELLIPSE(椭圆形部分为1);MORPH_CROSS(十字架部分为1)

Size:(3, 3);(5, 5)…

import cv2
import numpy as np
img = cv2.imread('./image/j.png')
# 自己创建5*5的卷积核
# kernel = np.ones((5, 5), np.uint8)
# 获得卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.erode(img, kernel)
cv2.imshow('orgin_img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

33ae2f92d41e4d579f2d60ff157b5f4b.png

dilate()

只要锚点非0,那么结果非0,卷积核越大,膨胀越大

dst = cv2.dilate(img, kernel, iterations = 1)

img:要膨胀的图像

kenel:卷积核,全1的矩阵

iterations:执行次数,默认为1次

import cv2
import numpy as np
img = cv2.imread('./image/j.png')
# 自己创建5*5的卷积核
# kernel = np.ones((5, 5), np.uint8)
# 获得卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# # 腐蚀
# dst = cv2.erode(img, kernel)
# 膨胀
dst = cv2.dilate(img, kernel)
cv2.imshow('orgin_img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

74ec8aff8c7a4ef2ae6b6d6422663880.png

2.4开、闭、梯度、顶帽、黑帽运算

开运算:腐蚀+膨胀

闭运算:膨胀+腐蚀

梯度:原图-腐蚀

顶帽:原图-开运算

黑帽:原图-闭运算


morphologyEx()

dst = cv2.morphologyEx(img, Type, kernel)

img:进行操作的原图

kernel:噪点大,用大核


Type:


MORPH_OPEN/MORPH_CLOSE(开闭运算)

MORPH_GRADIENT(梯度运算)

MORPH_TOPHAT/MORPH_BLACKHAT(顶黑帽)

开运算:去除文字外的小噪点

297364e4863d487183548f0b7b86cd2c.png

闭运算:去除文字内的小噪点

f2f9032362f54336b3b2214486935ac7.png

梯度运算:获得文字的轮廓


25c1b737ae364a1b81ecb88e713f8078.png

顶帽:得到大图像外的小图形

image.png

黑帽:得到大图形内的小图形

fa63c54acfa046f98b487ecbb8514f20.png

以上就是形态学相关API的使用。


目录
相关文章
|
9月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
746 1
|
4月前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
128 10
|
6月前
|
机器学习/深度学习 存储 数据挖掘
Python 编程入门:理解变量、数据类型和基本运算
【10月更文挑战第43天】在编程的海洋中,Python是一艘易于驾驭的小船。本文将带你启航,探索Python编程的基础:变量的声明与使用、丰富的数据类型以及如何通过基本运算符来操作它们。我们将从浅显易懂的例子出发,逐步深入到代码示例,确保即使是零基础的读者也能跟上步伐。准备好了吗?让我们开始吧!
83 0
|
7月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
230 7
|
7月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
484 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
9月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
536 1
|
9月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
1342 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
9月前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。
|
7月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
2091 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
8月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
109 4

热门文章

最新文章