2

私は一連の jpg を読み込んでから、OpenCV の convertTo(Mat, CV_32FC3) 関数を使用してそれらを変換しています。

    Mat outImg = Mat.zeros(tmp.size(), CV_32FC3);
    Mat curImg = new Mat();

    for (int i = 0; i < imgCount; i++) {
        fname = fp + String.format("%02d", i) + ".jpg";
        curImg = imread(fname);
        curImg.convertTo(curImg, CV_32FC3);
        Imgproc.accumulateWeighted(curImg, outImg, 0.01);
    }

    outImg.convertTo(outImg, CV_8UC3, ?????);
    imwrite(fp + "output" + "-" + curTime + ".jpg", outImg);

jpg に書き込む前に CV_8UC3 に戻す必要があると思いますが、その方法がわかりません。255 (convertTo() の 3 番目のパラメーター) を掛けてスケーリングする必要があるという他の SO の回答を見つけましたが、そうすると出力が完全に白くなります。100 の方が適切な数値ですが、それでもかなりの量のクリッピングがあります (8 ビット画像では 255 が最も論理的な数値であることは言うまでもありません)。これはこれを行う正しい方法ですか?そうでない場合、どうすれば画像を正しく保存できますか?

4

1 に答える 1

5

あなたの質問に答えるために、変換は

curImg.convertTo(curImg, CV_32FC3, 1/255.0);
outImg.convertTo(outImg, CV_8UC3, 255);

ただし、ここでの意図は、画像を平均化することによるノイズ削減であると思います。その場合、変換先/元からの変換CV_32FC3は必要ありません。入力画像の深度が何であれimread(デフォルト フラグを使用CV_LOAD_IMAGE_COLOR)、8 ビット画像としてロードされます (たとえば8UC3、カラー画像を想定)。したがって、変換せずに画像を平均化できます。

以下のように書き換えます。

Mat outImg;
for (int i = 0; i < imgCount; i++) {
    fname = fp + String.format("%02d", i) + ".jpg";
    //load as 8 bit image what ever was input image depth
    Mat curImg = imread(fname);
    Imgproc.accumulateWeighted(curImg, outImg, 0.01);
}
imwrite(fp + "output" + "-" + curTime + ".jpg", outImg);
于 2015-05-26T17:13:15.883 に答える