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);

我想我必须先将其转换回 CV_8UC3,然后才能将其写入 jpg,但我不知道该怎么做。我发现了其他一些 SO 答案,说我需要将它乘以 255(convertTo() 中的第三个参数)来缩放它,但是这样做会使输出完全变白。100 是一个更好的数字,但仍然存在大量剪辑(更不用说 255 是 8 位图片最合乎逻辑的数字)。这是正确的方法吗?如果没有,如何正确保存图像?

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 回答