为什么我的imshow与imwrite不同

时间:2016-08-03 08:34:01

标签: c++ image opencv visual-studio-2013 imshow

我在VS2013上使用OpenCV 2.4.8。我有以下代码片段:

    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 image

并且,imwrite图像: imwrite image

我想知道原因是图像类型。如果是这样,如何转换图像类型来解决问题。

3 个答案:

答案 0 :(得分:5)

对于CV_32F类型,您必须在使用imwrite之前将图像乘以255。

尝试imwrite(file_name, 255 *srcImg);

答案 1 :(得分:1)

首先转换为CV_8U,例如convertTo(dst, type, scale, shift),您可以确定两者都相同。

答案 2 :(得分:0)

现在我通过OpenCV函数convertTo解决我的问题。不仅需要TYPE,规模和班次的问题。

        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