在Python OpenCV中获取拉伸特征,应该使用哪种矩?

4 投票
1 回答
3031 浏览
提问于 2025-04-17 15:44

我该如何在Python的OpenCV中计算第一和第二矩,并获得形状的拉伸特征呢?

我对“拉伸”的定义不是很确定,我找到了一些信息:“不太常见的拉伸形状因子被定义为粒子在其主轴周围两个第二矩的比值的平方根。”(参考链接:http://en.wikipedia.org/wiki/Shape_factor_%28image_analysis_and_microscopy%29#Elongation_shape_factor

f_elong = sqrt (i2/i1)

根据这个定义,i2和i1是空间矩、中心矩还是归一化中心矩呢?(参考链接:http://opencv.willowgarage.com/documentation/cpp/imgproc_structural_analysis_and_shape_descriptors.html

1 个回答

4

计算形状的拉伸度有好几种方法,想了解更标准的计算方式和一种新提议,可以参考论文《从形状边界测量拉伸度》。

根据这篇论文,形状 S 的标准拉伸度 E 可以用下面的公式表示:

enter image description here

这里用到的所有矩都是中心矩。这个特性“源于形状方向的定义,基于最后的二次惯性矩的轴。具体来说,最小的二次惯性矩的轴是那条能让形状上所有点到这条线的距离平方和最小的直线。”(这段话直接摘自论文)。

在OpenCV中,这个计算可以直接用下面的代码实现:

import sys
import cv2

def elongation(m):
    x = m['mu20'] + m['mu02']
    y = 4 * m['mu11']**2 + (m['mu20'] - m['mu02'])**2
    return (x + y**0.5) / (x - y**0.5)

img = cv2.cvtColor(cv2.imread(sys.argv[1]), cv2.COLOR_BGR2GRAY)
# Assuming input has grayscale dark contours:
img = 255 - cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]

m = cv2.moments(img)
print elongation(m)

撰写回答