形态学基于图像的形状进行操作,用于处理二值化图像,主要包括腐蚀和膨胀两种基本操作。这些操作通常用于去除噪声、分隔或连接相邻的元素以及寻找图像中显著的最大点和最小点。
1. 形态学操作
import cv2
import numpy as np
import matplotlib.pyplot as plot
img = cv2.imread("tmp.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((5,5), np.uint8)
img_e = cv2.erode(img, kernel)
img_d = cv2.dilate(img, kernel)
plot.figure(figsize=(12,4));
plot.subplot(1,3,1)
plot.title('source image')
plot.imshow(img)
plot.subplot(1,3,2)
plot.title('erosion')
plot.imshow(img_e)
plot.subplot(1,3,3)
plot.title('dilation')
plot.imshow(img_d)
plot.show()
2. 概念简述
2.1 腐蚀(Erosion)
- 基本原理:腐蚀操作会将图像中的前景区域进行“侵蚀”,缩小物体的边界。核(kernel)会扫描图像的每个像素,如果核覆盖区域的所有像素值都是前景,则该像素保持不变;否则,它将被腐蚀成背景。因此,腐蚀可以有效去除图像中的小细节,比如孤立的噪声点。
- 应用场景:
- 去除噪声:腐蚀常用于消除图像中的孤立噪声点或小块不需要的细节。
- 分割连接物体:腐蚀可以用于分离连接较紧密的物体,例如两个接触的物体。
2.2 膨胀(Dilation)
- 基本原理:膨胀操作是腐蚀的反向操作,它通过扩展物体的边界来增加前景区域的面积。核(kernel)扫描图像时,如果核覆盖区域有一个或多个前景像素,那么该像素就会被膨胀为前景。因此,膨胀操作会使物体变大,并且可以填充前景区域中的小空隙或“洞”。
- 应用场景:
- 增强物体边界:膨胀通常用于在边界模糊的物体中增强边缘,使得物体更加明显。
- 连接断开的部分:膨胀可以用于连接图像中断开的物体,如中断的线条、文字或其他形状。
2.3 腐蚀与膨胀的结合
腐蚀和膨胀通常结合使用,形成了多种形态学操作:
- 开运算(Opening):先腐蚀后膨胀,常用于去除小物体或噪声,但保留物体整体结构。
- 闭运算(Closing):先膨胀后腐蚀,常用于填充物体内部的小空洞,平滑物体边缘。
- 形态学梯度:通过膨胀和腐蚀之间的差异,提取图像边缘
3. 开闭运算
import cv2
import numpy as np
import matplotlib.pyplot as plot
img = cv2.imread("tmp.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((5,5), np.uint8)
img_op = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
img_cl = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
img_gr = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
plot.figure(figsize=(16,4));
plot.subplot(1,4,1)
plot.title('source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Open')
plot.imshow(img_op)
plot.subplot(1,4,3)
plot.title('Close')
plot.imshow(img_cl)
plot.subplot(1,4,4)
plot.title('Gradient')
plot.imshow(img_gr)
plot.show()
4. Matplotlib显示函数对比
4.1 plot
绘制x,y的一元方程的函数关系图
plot ([x], y, [fmt], **kwargs)
- [x]:横坐标轴数据,可选参数
- y:纵坐标轴数据
- [fmt] :定义图形的基本样式:颜色,点型,线型
- **Kwargs:不定长的关键字参数,用字典形式设置图形的其他属性,或者重复x,y,fmt用于多条线同时显示
[fmt] 具体形式 ‘[颜色][标记][线型]’,是一个字符串来定义图的基本属性,详细分解如下:
颜色参数 | 颜色含义 |
---|---|
b | blue 蓝 |
g | green 绿 |
'r | red 红 |
c | cyan 蓝绿 |
m | magenta 洋红 |
y | yellow 黄 |
k | black 黑 |
w | white 白 |
标记参数 | 标记含义 |
---|---|
. | 点标记 |
, | 像素标记 |
o | 圆圈标记 |
v | 倒三角标记 |
^ | 正三角标记 |
< | 左三角标记 |
> | 右三角标记 |
1 | 朝下三角标记 |
2 | 朝上三角标记 |
3 | 朝左三角标记 |
4 | 朝右三角标记 |
s | 方形标记 |
p | 五角形标记 |
* | 星形标记 |
h | 六边形标记1 |
H | 六边形标记2 |
+ | 加号标记 |
x | 乘号标记 |
D | 钻石标记 |
d | 瘦钻石标记 |
| | 竖线标记 |
_ | 水平线标记 |
线型参数 | 线型含义 |
---|---|
- | 实线 |
- - | 虚线 |
-. | 点画线 |
: | 点线 |
4.2 imshow
创建图像对象并配置其属性,但不会显示图像
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs):
- X:输入数据。可以是二维数组、三维数组、PIL图像对象、matplotlib路径对象等。
- cmap:颜色映射。用于控制图像中不同数值所对应的颜色。可以选择内置的颜色映射,如gray、hot、jet等,也可以自定义颜色映射。
- norm:用于控制数值的归一化方式。可以选择Normalize、LogNorm等归一化方法。
- aspect:控制图像纵横比(aspect ratio)。可以设置为auto或一个数字。
- interpolation:插值方法。用于控制图像的平滑程度和细节程度。可以选择nearest、bilinear、bicubic等插值方法。
- alpha:图像透明度。取值范围为0~1。
- origin:坐标轴原点的位置。可以设置为upper或lower。
- extent:控制显示的数据范围。可以设置为[xmin, xmax, ymin, ymax]。
- vmin、vmax:控制颜色映射的值域范围。
- filternorm 和 filterrad:用于图像滤波的对象。可以设置为None、antigrain、freetype等。
- imlim: 用于指定图像显示范围。
- resample:用于指定图像重采样方式。
- url:用于指定图像链接。
4.3 显示图像
show
实际上显示所有已经配置好的图形,包括由 imshow 创建的图像,具体步骤概述如下:
- 导入Matplotlib库:import matplotlib.pyplot as plt
- 创建图形对象:fig = plt.figure()
- 绘制图形:使用Matplotlib提供的绘图函数进行绘制,例如plt.plot(y)绘制折线, plt.imshow((x,y))绘制图像等
- 调用show()函数显示图形:plt.show()
系列文章: