python opencv 图像处理(九)

简介: python opencv 图像处理(九)

图像腐蚀与图像膨胀


图像的腐蚀( Erosion )和膨胀( Dilation )是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。


又出来新名词了:形态学。


简单来讲,图像形态学就是改变图像的形状,举例对于文字数字图像,将文字数字的线条变细或变粗。


图像形态学一些基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等等。

d2691dcbe3e8c342db77632e100ccc12.png

其中图像的膨胀和腐蚀是最基础的图像形态学操作,他们主要的功能如下:


消除噪声

分割( isolate )出独立的图像元素,在图像中连接( join )相邻的元素。

寻找图像中的明显的极大值区域或极小值区域

求出图像的梯度

在接着往下看之前,有一点需要注意的是,图像的腐蚀与膨胀,主要针对的是二值图像(黑白图)的,其中进行变化的部分是图像的白色部分(高亮)部分,不是黑色部分。


图像膨胀就是图像中的高亮部分进行膨胀,「领域扩张」,效果图拥有比原图更大的高亮区域。


图像腐蚀就是原图中的高亮部分被腐蚀,「领域被蚕食」,效果图拥有比原图更小的高亮区域。


图像腐蚀


图像腐蚀其中有两个比较关键的输入对象,一个是二值图像,另一个是卷积核。

腐蚀:是一种消除边界点,使边界向内部收缩的过程


  • 通俗讲法:在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则这个小区域的所有像素点都为0,来达到瘦身的目的

算法:用 3x3 的kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为1,则图像的该像素为1;否则为0.最终结果:使二值图像减小一圈。(也就是做卷积乘法,取图像尺寸与卷积核一样大小区域与卷积核一一像素值相乘,与卷积不同的是,卷积计算像素一一相乘后要累计求和,这里是需要判断是否存在相乘值为0的)

OpenCV 为图像腐蚀提供的函数是:erode() ,它的原函数如下:


def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)


src:原图像。

kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

iterations:迭代次数,默认是迭代一次,表示进行一次腐蚀,如有需要,可进行多次迭代腐蚀。

这里通常设置卷积核所有值为1,只要是原始二值图像中像素值不为0,保留原始像素并做腐蚀处理。


import cv2 as cv
import numpy as np
def erode():
 # 图像读取
    src = cv.imread('data.jpg')
     # BGR 图像转灰度
    gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    # 二值图像处理
    r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
    # 设置卷积核
    kernel = np.ones((3, 3),np.uint8)
    # 进行图像腐蚀,默认迭代 1 次
    dst1 = cv.erode(b, kernel)
    # 图像显示
    cv.imshow("source", src)
    cv.imshow("b",b)
    cv.imshow("dst1", dst1)
    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()


bd43f797e8aeff3d5847d8cef11e9648.png


备注:卷积核的大小与迭代次数都会影响图像腐蚀的效果,通常卷积核越大,腐蚀效果越高,迭代次数越多,腐蚀效果越高,反之效果越小。


图像膨胀


图像膨胀正好和图像腐蚀相反,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只要有一个值为 1 时则为 1 ,否则为 0 。

OpenCV 为图像腐蚀提供的函数是:dilate() ,它的原函数如下:


def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)


  • src:原图像。
  • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
  • iterations:迭代次数,默认是迭代一次,表示进行一次膨胀,如有需要,可进行多次迭代腐蚀。

示例代码如下:


import cv2 as cv
import numpy as np
def dilate():
 # 图像读取
    src = cv.imread('data.jpg')
     # BGR 图像转灰度
    gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    # 二值图像处理
    r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
    # 设置卷积核
    kernel1 = np.ones((8, 8),np.uint8)
    # 进行图像腐蚀,默认迭代 1 次
    dst1 = cv.dilate(b, kernel1)
    # 图像显示
    cv.imshow("source", src)
    cv.imshow("b", b)
    cv.imshow("dst1", dst1)
    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()


1c9fed77037e716a515a869992282836.png

相关文章
|
2天前
|
机器学习/深度学习 存储 监控
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
|
2天前
|
计算机视觉 Python
【Python实战】——Python+Opencv是实现车牌自动识别
【Python实战】——Python+Opencv是实现车牌自动识别
|
2天前
|
算法 计算机视觉
【OpenCV】计算机视觉图像处理基础知识(下)
【OpenCV】计算机视觉图像处理基础知识(下)
|
2天前
|
人工智能 计算机视觉 Python
【OpenCV】计算机视觉图像处理基础知识(上)
【OpenCV】计算机视觉图像处理基础知识(上)
|
2天前
|
算法 Serverless 计算机视觉
使用OpenCV和Python进行极线校正
使用OpenCV和Python进行极线校正
16 1
|
2天前
|
算法 安全 机器人
最新版opencv4.9安装介绍,基本图像处理详解
最新版opencv4.9安装介绍,基本图像处理详解
|
2天前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
2天前
|
数据挖掘 计算机视觉 Python
SciPy图像处理技巧:图像增强与特征提取
【4月更文挑战第17天】本文介绍了如何使用SciPy进行图像增强和特征提取。通过调整亮度、对比度和伽马校正实现图像增强,示例代码展示了相关操作。同时,利用Sobel算子进行边缘检测和Laplacian of Gaussian (LoG) 进行角点检测,以提取图像特征。虽然SciPy不是专业的图像处理库,但其数值计算能力在图像分析中仍有一定价值,可与其他图像处理库结合使用。
|
2天前
|
机器学习/深度学习 存储 算法
OpenCV与NumPy:图像处理中的黄金组合
【4月更文挑战第17天】OpenCV和NumPy是Python图像处理的两大利器,互补协作形成黄金组合。OpenCV专注计算机视觉,提供丰富算法,而NumPy擅长数值计算和数组操作。两者无缝对接,共同实现高效、灵活的图像处理任务。通过灰度化、二值化、边缘检测等案例,展示了它们的协同作用。未来,这一组合将在计算机视觉和机器学习领域发挥更大作用,解锁更多图像处理潜力。
|
2天前
|
机器学习/深度学习 算法 Linux
使用OpenCV在Python中进行图像处理
使用OpenCV在Python中进行图像处理