简单的图像处理——1. 图像的形态学操作:膨胀与腐蚀

图像的形态学操作

接着前面的图像入门,现在介绍一些简单的图像处理方法,同时在介绍方法之后,还会附上Python的实现,主要是基于Opencv这一库来进行实现。

网上关于简单的图像处理的文章有很多很多,后面简单的图像处理系列博客中,或多或少的参考了下述这些大佬的分享:

在简单的图像处理中,我们会从最基础的图像形态学操作说起(平移、旋转、反射、剪裁等操作这里就不进行详细的说明了)。在这之前,我们先回顾一下图像的基本组成。


1. 回顾:万物皆数

数字图像的组成单元都是由一个一个的数字构成的,每个数字我们也称之为像素。像素点越密,则图像越清晰;像素点越稀,则图像越模糊。另外,每个数字的大小代表颜色的深浅。就一张灰度图而言,其是一个图层的,上面的值越大,就说明图像这个点越白,255对应的就是白色。而值越小则代表着颜色越黑,0对应的就是黑色。具体如下图所示:
这里写图片描述

而彩色图对应的是三个图层,分别为R\G\B,每个层都是0-255之间,三个图层叠加,就是我们所看到的彩色数字图像了。


2. 什么是形态学操作?

一系列操作基于形状来操作图像,形态学操作通过在图像上应用结构元素来产生输出图像。

改变物体的形状,比如腐蚀就是“变瘦”,膨胀就是“变胖”,如下面这张图所示:


然后包括膨胀腐蚀在内,一系列的这两者各种叠加作用的操作都称为图像的形态学操作。

最基础的形态学操作就是腐蚀膨胀。它包含广泛的应用:

  • 移除噪声
  • 孤立一些单独的元素和聚合一些分散的元素
  • 找到图像中的局部块状或者孔

我们使用下面这只可爱的小鸟,来对一系列的形态学操作进行说明。
这里写图片描述


3. 膨胀与腐蚀

膨胀

使用卷积核B对图片A进行卷积运算,求局部最大值,这个卷积核可以有任意的形状和大小,通常是一个方形或者圆形。
卷积核B通常有个锚点,通常位于卷积核的中央位置。

随着卷积核扫描这个图像,我们计算叠加区域的最大像素值,并将锚点的位置用最大值替换。也就是最大化操作导致图片中亮的区域增长(所以这里面叫做膨胀)。


这里写图片描述

如上面两图所示,上面第一个图是针对二值图进行操作,上面的第一个是针对二值图进行操作膨胀操作。可以发现,这一操作是使得白色区域“变胖”,黑色区域“变瘦”,从下图即可看出。


而针对彩色图像,可以想象,由于我们是只保留最大值,所以当选取的核越大时,图像整体会越模糊,并且会越偏向于白色(因为白色对应的值是255),下面两图分别是核为10*10以及核为50*50两种情况进行膨胀的效果,大家可以感受一下。
核为10*10
核为50*50


腐蚀

膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。腐蚀与膨胀类似,计算卷积核里面的最小元素

随着卷积核B扫描图片,它会计算B叠加区域的最小像素值,并使用这个像素值替换锚点的值。与膨胀相似,对原始的图像应用腐蚀操作。你可以看到背景亮的区域变小,而黑的区域变得很大


这里写图片描述

在二值图上直观的体现,就是白色的部分变小,黑色的部分变大,正好与前面的膨胀相对。


而针对彩色图像,一样可以想象,由于我们是只保留最小值,所以当选取的核越大时,图像整体会越模糊,并且会越偏向于黑色(黑色对应的值是0),其中一些黑色的小元素也会被放大(例如下图中的小沙子),下面两图分别是核为10*10以及核为50*50两种情况进行腐蚀的效果,第二张非常惊悚。

这里写图片描述
这里写图片描述


4. OpenCV

这里我们想要通过Python或者其他代码进行实现,需要使用OpenCV来进行相关操作。

OpenCV是计算机视觉领域应用最广泛的开源工具包,基于C/C++,支持Linux/Windows/MacOS/Android/iOS,并提供了Python,Matlab和Java等语言的接口,因为其丰富的接口,优秀的性能和商业友好的使用许可,不管是学术界还是业界中都非常受欢迎。

OpenCV最早源于Intel公司1998年的一个研究项目,当时在Intel从事计算机视觉的工程师盖瑞·布拉德斯基(Gary Bradski)访问一些大学和研究组时发现学生之间实现计算机视觉算法用的都是各自实验室里的内部代码或者库,这样新来实验室的学生就能基于前人写的基本函数快速上手进行研究。

OpenCV旨在提供一个用于计算机视觉的科研和商业应用的高性能通用库。

这里我们通过Python进行实现。


5. Python实现

Python安装OpenCV

  1. 安装Python,建议直接安装anoconda,装Python3的版本
  2. 初学者直接使用里面的Spyder或ipython notebook
  3. 直接使用Win + R,打开命令行,输入pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple,进行OpenCV的安装。

读入图片

载入依赖库:

import cv2         # 载入依赖库,用于图像处理
import os          # 载入依赖库,用于设置文件路径
import numpy as np # 载入依赖库,用于生成kernel

进行图片读取:

#设置文件路径,类似R中的setwd()
os.chdir('D:\Pictures\Python使用') 

# 读入图片
img = cv2.imread('1.png') 

膨胀腐蚀

# 设置kernel,也可以利用getStructuringElement()函数指明它的形状
kernel = np.ones((5, 5), np.uint8) 
# 膨胀,iterations指的是腐蚀次数,省略是默认为1
dilation = cv2.dilate(img0, kernel, iterations = 1)
# 腐蚀
erosion = cv2.erode(img0, kernel)

查看与存储图片

显示图片(这里不推荐使用显示图片的代码,稍有不慎容易卡死,建议使用后面储存出来看图片):

cv2.imshow("dilation", dilation)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.imshow("erosion", erosion)
cv2.waitKey()
cv2.destroyAllWindows()

存储图片:

cv2.imwrite("dilation.jpg", dilation)
cv2.imwrite("erosion.jpg", erosion)

后面会接着讲图像的其他形态学操作,并附上Python实现。

猜你喜欢

转载自blog.csdn.net/weixin_41929524/article/details/81187173