图像形态学操作对比(Opencv)

发布于:2025-04-13 ⋅ 阅读:(13) ⋅ 点赞:(0)

形态学基于图像的形状进行操作,用于处理二值化图像,主要包括腐蚀和膨胀两种基本操作。这些操作通常用于去除噪声、分隔或连接相邻的元素以及寻找图像中显著的最大点和最小点。

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 创建的图像,具体步骤概述如下:

  1. 导入Matplotlib库:import matplotlib.pyplot as plt
  2. 创建图形对象:fig = plt.figure()
  3. 绘制图形:使用Matplotlib提供的绘图函数进行绘制,例如plt.plot(y)绘制折线, plt.imshow((x,y))绘制图像等
  4. 调用show()函数显示图形:plt.show()

系列文章:

  1. opencv常用边缘检测算子示例
  2. 图像颜色空间对比(Opencv)
  3. 图像变换方式区别对比(Opencv)
  4. 常用图像滤波及色彩调节操作(Opencv)
  5. 图像形态学操作对比(Opencv)

网站公告

今日签到

点亮在社区的每一天
去签到