Проблем при конвертирането на 32FC3 в 8UC3 за запазване на изображение като jpg в OpenCV

Чета поредица от jpg файлове и след това използвам функцията convertTo(Mat, CV_32FC3) на OpenCV, за да ги конвертирам:

    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-битова картина). Това ли е правилният начин да направите това? Ако не, как мога да запазя изображението правилно?


person ahota    schedule 26.05.2015    source източник
comment
Какви са минималната и максималната стойност на outImg преди преобразуване?   -  person beaker    schedule 26.05.2015


Отговори (1)


За да отговоря на въпроса ви, реализациите биха били

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);
person kiranpradeep    schedule 26.05.2015