почему мое imshow отличается от imwrite

Я использую OpenCV 2.4.8 на VS2013. У меня есть следующий фрагмент кода:

    Mat img_sum = Mat::zeros(img_gray.size(), CV_32F);
char file_name[FILENAME_MAX];
for (int i = 0; i < SCALE_SIZE; i++){
for (int j = 0; j < ORIENTATION_SIZE; j++){
Mat srcImg;
g_gabor[i*ORIENTATION_SIZE + j].conv_img(img_gray, srcImg, CV_GABOR_REAL);

memset(file_name, NULL, FILENAME_MAX);
sprintf_s(file_name, "gabor_images/%d_%d.png", i, j);
imwrite(file_name, srcImg);
imshow("Gabor滤波结果", srcImg);    //此时srcImg.type() == 1
waitKey(100);
}
}
imwrite("img_sum.png", img_sum);

Ключевой вопрос — результат imwrite и imshow. Они дали мне другой результат.

Изображение imshow:
Imshow изображение

И, напишите изображение:
напечатать изображение

Мне было интересно, если причина в типе изображения. Если да, то как конвертировать тип изображения для решения проблемы.

3

Решение

Когда вы конвертируете в CV_8U во-первых, например, с convertTo(dst, type, scale, shift), вы можете быть уверены, что оба идентичны.

1

Другие решения

С типом CV_32FВы должны умножить свое изображение на 255, прежде чем использовать imwrite.

Пытаться imwrite(file_name, 255 *srcImg);,

5

Теперь я решаю свой вопрос с помощью функции OpenCV convertTo. Это не только проблема ТИПА, масштаб и сдвиг также необходимы.

        double minVal, maxVal;
minMaxLoc(srcImg, &minVal, &maxVal); //find minimum and maximum intensities
Mat charImage;
srcImg.convertTo(charImage, CV_8U, 255.0 / (maxVal - minVal), -minVal);
imwrite(file_name, charImage);
imshow("Gabor滤波结果", srcImg);    //此时srcImg.type() == 1
0
По вопросам рекламы [email protected]