cvIntegral の使用法を理解しようとしています。出力画像は添付画像のように動作しますか? ええ、手動で計算すると、左上の部分の値が小さく(黒)、右下に行くにつれて(明るくなります)。正規化 (0 ~ 255) を使用しないと、イメージは完全に白くなり、次に一部が黒くなります。
元の画像
積分画像の正規化
cvIntegral の使用法を理解しようとしています。出力画像は添付画像のように動作しますか? ええ、手動で計算すると、左上の部分の値が小さく(黒)、右下に行くにつれて(明るくなります)。正規化 (0 ~ 255) を使用しないと、イメージは完全に白くなり、次に一部が黒くなります。
元の画像
積分画像の正規化
実際には、3つのタイプがあるため、計算する積分のタイプによって異なります-ドキュメントから:
この関数は、次のようにソース イメージの 1 つまたは複数の積分イメージを計算します。
最初のタイプの積分について話すと、これは単なる長方形内のすべてのピクセルの合計です[(0,0),(x,y)]
。積分画像の私の出力はこれでした:
論理的に正しいと思われるもの。
正規化 ( 255/max
) を使用すると、出力と同じ画像が表示されます。
更新:
エラーが発生したようです-imwrite
統合された画像の一部の値が大きすぎる(255より大きい)ため、画像の品質が低下します(おそらく)が、imshow
正常に表示されます(その画像は単なるスクリーンショットでした)。したがって、あなたが行ったように正規化を使用してください。コードは次のとおりです。
Mat src = imread("moon.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat int1, norm;
integral(src, int1);
double max;
minMaxIdx(int1, 0, &max);
int1.convertTo(norm, CV_8UC1, 255/max);
imshow("simple output", int1);//shows normally
imshow("normalized output", norm);
//imwrite("output.jpg", int1);// looses quality
waitKey();