今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)
本人所用树莓派4B 装载的系统与版本如下:
版本可用命令 (lsb_release -a) 查询:
Opencv 版本是4.5.1:
图像的膨胀与腐蚀一般用于灰度图或者二值图,今日便来学习一下
文章提供测试代码讲解,整体代码贴出、测试效果图、整体工程下载
目录
结构元素:
结构元素是一个定义邻域内像素关系的矩阵,它决定了膨胀和腐蚀操作如何影响图像的像素。结构元素的形状和大小对操作结果有显著影响。
图像膨胀中的结构元素
- 作用:图像膨胀是通过将结构元素与图像进行逐像素的比较,只要结构元素与图像有任何一个相交的像素,输出图像对应像素即为前景(通常为白色),否则为背景(通常为黑色)。这可以使前景区域扩张,填充空洞和连接断裂的区域。
- 种类:结构元素的种类可以是正方形、十字形、椭圆形等。
- 尺寸:结构元素的尺寸大小可以用
Size ksize
参数来指定,例如一个3x3的结构元素。- 中心点:结构元素的中心点位置可以用
Point anchor
参数来指定,默认参数为结构元素的几何中心点。图像腐蚀中的结构元素
- 作用:图像腐蚀是通过将结构元素与图像进行逐像素的比较,只有当结构元素完全覆盖对应图像区域时,输出图像对应像素才为前景,否则为背景。这可以使前景区域缩小,去除细小的细节和孤立的像素。
- 种类与尺寸:结构元素的种类和尺寸与膨胀操作中的相同,可以是正方形、十字形、椭圆形等,尺寸大小可以用
Size ksize
参数来指定。- 中心点:结构元素的中心点位置与膨胀操作中的相同,可以用
Point anchor
参数来指定,默认参数为结构元素的几何中心点。
结构元素生成函数
在OpenCV中,可以使用
getStructuringElement()
函数来生成图像形态学操作中常用的结构元素。该函数接受三个参数:
int shape
:结构元素的种类,可以是矩形(MORPH_RECT
)、椭圆形(MORPH_ELLIPSE
)或交叉形(MORPH_CROSS
)。Size ksize
:结构元素的尺寸大小。Point anchor = Point(-1,-1)
:中心点的位置,默认参数为结构元素的几何中心点。
OpenCv图像腐蚀:
图像腐蚀的目的:
1、去除图像中微小物体
2、分离较近的俩个物体
3、减少一部分信息
图像腐蚀的原理:
- 原理描述:
- 腐蚀操作是通过一个结构元素(也称为卷积核或模板)对图像进行扫描,结构元素通常是一个小的矩形、十字形或椭圆形。
- 对于二值图像(只有0和1两种像素值),腐蚀操作是检查结构元素覆盖的图像区域,取这些像素值中的最小值来替换结构元素中心位置处的像素值。
- 由于在二值图像中,0通常代表黑色或背景,而1代表白色或前景,因此腐蚀操作实质上是一种“领域被蚕食”的过程,导致高亮区域(白色区域)变小。
- 操作过程:
- 定义一个结构元素(例如3x3的正方形),并指定一个锚点(通常位于结构元素的中心)。
- 将结构元素的锚点放置在图像的每个像素位置上,检查结构元素覆盖的图像区域。
- 取结构元素覆盖区域内所有像素的最小值,用这个最小值替换锚点位置处的像素值。
- 重复上述过程,直到扫描完整个图像。
- 效果与用途:
- 经过腐蚀操作后,图像中的高亮区域会变小,毛刺和孤立的像素点会被消除,从而提取出图像的主要信息。
- 腐蚀操作可以用于边缘检测,通过先膨胀后腐蚀可以使边缘更加明显。
- 它也可以用于去噪,通过一定次数的腐蚀操作可以消除二值图像中的噪声点或孤立的像素点。
- 参数与调整:
- 腐蚀操作的效果可以通过调整结构元素的大小、形状以及腐蚀的迭代次数来控制。
- 结构元素的大小和形状决定了腐蚀的邻域范围和形状。
- 迭代次数表示腐蚀操作的重复次数,次数越多,腐蚀效果越明显。
- OpenCV实现:
- 在OpenCV中,可以使用
cv2.erode()
函数来实现腐蚀操作。- 该函数接受三个主要参数:输入图像、结构元素和迭代次数。
- 结构元素可以使用
cv2.getStructuringElement()
函数来创建。
图像腐蚀的代码示例:
以下代码读取一张图片,先以127为阈值进行二值化处理得到二值图,在进行腐蚀得到腐蚀图的过程,每种操作都展示图片:
# coding: utf-8 import cv2 import numpy as np #创建窗口并调整大小:用于显示原图 cv2.namedWindow("Original image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Original image",360,360) #创建窗口并调整大小:用于显示原图转化的二值图 cv2.namedWindow("Binary Image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Binary Image",360,360) #创建窗口并调整大小:用于显示腐蚀后的样子 cv2.namedWindow("Eroded image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Eroded image",360,360) #从指定目录读取一张图片 image=cv2.imread('/home/pi/Pictures/Eroded_image_test2.jpg',0) #定义腐蚀操作的结构元素 kernel=np.ones((2,2),np.uint8) #图像二值化处理:使用127作为阈值 _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) #进行图像腐蚀操作(对二值图进行腐蚀),iterations表示腐蚀次数 eroded_image=cv2.erode(binary_image,kernel,iterations=1) while True: #显示原始图\二值图\腐蚀后的图 cv2.imshow('Original image',image) cv2.imshow('Eroded image',eroded_image) cv2.imshow('Binary Image', binary_image) #等待按下‘q’退出 key=cv2.waitKey(1) if key&0XFF==ord('q'): break #释放所有资源 cv2.destroyAllWindows()
图像腐蚀的效果展示:
这里提供了俩张图片进行腐蚀实验,一张白底黑字,一张黑底白字,名称分别是Eroded_image_test1.jpg和Eroded_image_test2.jpg,只需更改17行代码即可测试俩种图片
对于黑底白字的图像的腐蚀如下:
对于白底黑字的图像的腐蚀如下:
OpenCv图像膨胀:
图像膨胀的目的:
1、膨胀操作主要是使图像中高亮部分扩张,使得膨胀后的图像拥有比原图更大的高亮区域。
2、将有价值的信息放大
图像膨胀的原理:
膨胀过程:
- 膨胀的过程类似于卷积操作。使用一个结构元素(通常称为核或卷积核)在图像上滑动,并取结构元素覆盖区域的最大值来替换中心像素的值。
- 结构元素可以是正方形、十字形、圆形等形状,大小也可以根据需要进行调整。
膨胀的作用:
- 物体连接:当图像中的物体有一些小的断裂或缝隙时,膨胀操作有助于将它们连接成一个整体。
- 填充小孔:膨胀可以填充物体内的小孔或空洞,使物体更加连续。
- 增加物体大小:膨胀操作会扩大图像中的物体,这在需要增加物体大小或加强物体边缘时很有用。
- 去除小物体:膨胀可以用于去除图像中一些小的噪声或不相关的物体。通过膨胀操作,较小的物体可能会被合并到周围较大的物体中,从而减小图像中不必要的小结构。
- 去除噪声:对于二值图像中的噪声点或孤立的像素点,通过膨胀操作可以填充小的噪声点。
- 提取信息:通过膨胀和腐蚀操作可以提取文本区域或其他感兴趣的区域。
膨胀操作的参数:
- src:源图像,即要进行膨胀操作的图像。
- kernel:膨胀操作的结构元素,定义了膨胀操作的形状和大小。
- iterations:膨胀操作的迭代次数,即结构元素在图像上滑动的次数。较大的迭代次数会产生更明显的膨胀效果。
图像膨胀的代码示例:
以下代码读取一张图片,先以127为阈值进行二值化处理得到二值图,在进行膨胀得到膨胀图的过程,每种操作都展示图片:
# coding: utf-8 import cv2 import numpy as np #创建窗口并调整大小:用于显示原图 cv2.namedWindow("Original image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Original image",360,360) #创建窗口并调整大小:用于显示原图转化的二值图 cv2.namedWindow("Binary Image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Binary Image",360,360) #创建窗口并调整大小:用于显示膨胀后的样子 cv2.namedWindow("Dilated image",cv2.WINDOW_NORMAL) cv2.resizeWindow("Dilated image",360,360) #从指定目录读取一张图片 image=cv2.imread('/home/pi/Pictures/Dilate_image_test1.jpg',0) #定义膨胀操作的结构元素 kernel=np.ones((3,3),np.uint8) #图像二值化处理:使用127作为阈值 _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) #进行图像膨胀操作(对二值图进行膨胀),iterations表示膨胀次数 dilated_image=cv2.dilate(binary_image,kernel,iterations=1) while True: #显示原始图\二值图\腐蚀后的图 cv2.imshow('Original image',image) cv2.imshow('Dilated image',dilated_image) cv2.imshow('Binary Image', binary_image) #等待按下‘q’退出 key=cv2.waitKey(1) if key&0XFF==ord('q'): break #释放所有资源 cv2.destroyAllWindows()
图像膨胀的相关展示:
这里提供了俩张图片进行腐蚀实验,一张白底黑字,一张黑底白字,名称分别是Dilate_image_test1.jpg和Dilate_image_test2.jpg,只需更改17行代码即可测试俩种图片
对于黑底白字的图像的膨胀如下:
对于白底黑字的图像的膨胀如下:
整体代码与测试图片打包下载:
网上资料查阅:
标签:树莓,image,元素,cv2,OpenCv,腐蚀,图像,膨胀,4B From: https://blog.csdn.net/qq_64257614/article/details/139678423