OpenCVで次の計算を行う方法を理解しようとしています。
バイナリ イメージ (黒/白) を想定すると、次のようになります。
画像の中心からの白いピクセルの平均距離。ほとんどの白いピクセルがエッジ近くにある画像は高いスコアを持ち、ほとんどの白いピクセルが中央近くにある画像は低いスコアになります。
ループを使用してこれを手動で行う方法は知っていますが、Java を使用しているので、ネイティブである一連の高性能 OpenCV 呼び出しにオフロードしたいと思います。
ありがとう
OpenCVで次の計算を行う方法を理解しようとしています。
バイナリ イメージ (黒/白) を想定すると、次のようになります。
画像の中心からの白いピクセルの平均距離。ほとんどの白いピクセルがエッジ近くにある画像は高いスコアを持ち、ほとんどの白いピクセルが中央近くにある画像は低いスコアになります。
ループを使用してこれを手動で行う方法は知っていますが、Java を使用しているので、ネイティブである一連の高性能 OpenCV 呼び出しにオフロードしたいと思います。
ありがとう
distanceTransform()
ほとんどあなたが望むものです。残念ながら、最も近い黒いピクセルまでの距離しか計算されないため、データを少し調整する必要があります。distanceTransform()
画像が正しく機能するためには、中央に黒いピクセルが 1 つだけ含まれている必要があります。
私の方法は次のとおりです。
distanceTransform()
変更された画像を呼び出すmean()
バイナリ イメージの白いピクセルをマスクとして使用して、平均距離を計算します。コード例を以下に示します。これは C++ ですが、アイデアを得ることができるはずです。
cv::Mat img; // binary image
img.setTo(128, img == 0);
img.at<uchar>(img.rows/2, img.cols/2) = 0; // Set center point to zero
cv::Mat dist;
cv::distanceTransform(img, dist, CV_DIST_L2, 3); // Can be tweaked for desired accuracy
cv::Scalar val = cv::mean(dist, img == 255);
double mean = val[0];
そうは言っても、この方法が実際にループで反復するよりも速いかどうかをテストすることをお勧めします。このメソッドは、API 呼び出しに対応するために、必要以上に多くの処理を行います。