4

Python opencvで1番目と2番目のモーメントを計算し、形状の伸び機能を取得するにはどうすればよいですか?

伸びの定義についてはよくわかりません。「あまり一般的ではない伸びの形状係数は、主軸の周りの粒子の2秒モーメントの比率の平方根として定義されます」(参照: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)?

4

1 に答える 1

3

伸びを計算する方法は複数あります。より標準的な方法と新しい方法の提案については、論文「形状境界からの伸びの測定」を参照してください。

この同じ論文に基づいてE、形状の標準伸びSは次の式で与えられます。

ここに画像の説明を入力

使用されるすべての瞬間が中心的なものです。この機能は、「最後の二次慣性モーメントの軸に基づく形状の向きの定義から派生しています。正確には、最小二次慣性モーメントの軸は、距離の二乗の積分を最小化する直線です。ポイント(形状に属する)を線に」(紙からそのまま取得)。

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)
于 2013-02-18T01:14:21.197 に答える