01 引言 在数字图像处理、计算机视觉与相关领域中,图像矩(Image moments)是指图像的某些特定像素灰度的加权平均值(矩),或者是图像具有类似功能或意义的属性。 图像矩通常用来描述 分割 后的图像对象。可以通过图像的矩来获得图像的部分性质,包括面积(或总体亮度),以及有关几何中心和方向的信息 。 02 原始矩 原始矩中包含以下有关原始图像属性的信息:
03 中心矩 中心矩是以质心为中心的矩,相比原始矩,只要添加一个平移即可,中心矩的定义如下: 上述公式中的 有了中心矩的定义,我们可以得到图像f的协方差矩阵,其定义为: 接着我们可以计算该协方差矩阵的特征向量,最大特征值对应的特征向量就是物体长轴的角度,我们可以将其定义为物体的方向. 该角度计算公式如下: 04 中心矩的性质 接下来我们推导一下阶数较低的中心矩的性质: 04 应用 推导了一堆公式,不知道小伙伴有没有觉得很枯燥。 好的吧,接下来我们来举个栗子,进入轻松的写代码实战环节. 本节的目的在于利用矩求出前景物体的中心点以及长轴的角度. 1) 读取图像 我们这里以一群飞翔的大雁组成的图像为例来进行讲解,首先我们读入图像并执行灰度化,代码如下: img_file = './images/bird_swarm.jpg' img = cv2.imread(img_file,cv2.IMREAD_COLOR) gray_img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) 效果如下: 上图中,左侧为原始输入图,右侧为灰度化后的图像. 2) 二值化 通过第二章节我们知道,二值图像的原始矩就是所有像素值之和,所以我们可以先进行二值化来提取我们的前景物体,二值化代码如下:
结果如下: 可以看出,我们使用较低的阈值,将前景大雁(白色部分)通过二值化提取出来. 3) 图像矩的计算 接下来我们来计算图像矩,我们得到的二值化图中,对于前景大雁来说 根据上文矩的定义,编写代码如下: m00 = m01 = m10 = m11 = m20 = m02 = m21 = m12 = 0 height, width = bin_img.shape for y in range(height): for x in range(width): m00 += bin_img[y, x] m10 += x * bin_img[y, x] m01 += y * bin_img[y, x] m11 += x * y * bin_img[y, x] m20 += x * x * bin_img[y, x] m02 += y * y * bin_img[y, x] m21 += x * x * y * bin_img[y, x] m12 += x * y * y * bin_img[y, x] 进而利用以下代码可以得到中心点的位置坐标:
输出如下: Centriod: (1039.64, 660.24) 画到图像上,结果如下: 上图中的红色小圆圈即为计算出来的大雁群的中心点. 4) 计算角度 根据上述中心矩的定义和物体长轴角度的定义,我们可以计算出大雁群长轴和水平线的夹角,代码如下:
输出如下: Angle 37.96 5) 结果可视化 虽然通过上述代码,我们可以计算出大雁群的质心和长轴角度,但是只有数值不太直观,那么我们接下来来可视化上述输出. 我们现在在原始图像上绘制长轴和短轴(这里设置默认长度)以可视化说明质心和角度的位置。 代码如下:
运行结果如下: 上图中,蓝色边为大雁群的短轴,红边为大雁群的长轴,绿色圆圈为大雁群的几何中心. 05 总结 本文介绍了图像矩和中心矩的相关定义和一些基本性质,并举例来实现对图像矩的求解和可视化得到的结果,并给出了完整代码实现。 您学废了吗? |
|