簡體   English   中英

OpenCV-2.4.8.2:imshow與imwrite不同

[英]OpenCV-2.4.8.2: imshow differs from imwrite

我在Mac OS 10.9.5上使用OpenCV2.4.8.2。 我有以下代碼片段:

static void compute_weights(const vector<Mat>& images, vector<Mat>& weights)
{
    weights.clear();
    for (int i = 0; i < images.size(); i++) {
        Mat image = images[i];
        Mat mask = Mat::zeros(image.size(), CV_32F);
        int x_start = (i == 0) ? 0 : image.cols/2;
        int y_start = 0;
        int width = image.cols/2;
        int height = image.rows;
        Mat roi  = mask(Rect(x_start,y_start,width,height)); // Set Roi
        roi.setTo(1);
        weights.push_back(mask);
    }
}

static void blend(const vector<Mat>& inputImages, Mat& outputImage)
{
    int maxPyrIndex = 6;
    vector<Mat> weights;
    compute_weights(inputImages, weights);

    // Find the fused pyramid:
    vector<Mat> fused_pyramid;
    for (int i = 0; i < inputImages.size(); i++) {
        Mat image = inputImages[i];
        // Build Gaussian Pyramid for Weights
        vector<Mat> weight_gaussian_pyramid;
        buildPyramid(weights[i], weight_gaussian_pyramid, maxPyrIndex);

        // Build Laplacian Pyramid for original image
        Mat float_image;
        inputImages[i].convertTo(float_image, CV_32FC3, 1.0/255.0);
        vector<Mat> orig_guassian_pyramid;
        vector<Mat> orig_laplacian_pyramid;
        buildPyramid(float_image, orig_guassian_pyramid, maxPyrIndex);
        for (int j = 0; j < orig_guassian_pyramid.size() - 1; j++) {
            Mat sized_up;
            pyrUp(orig_guassian_pyramid[j+1], sized_up, Size(orig_guassian_pyramid[j].cols, orig_guassian_pyramid[j].rows));
            orig_laplacian_pyramid.push_back(orig_guassian_pyramid[j] - sized_up);
        }
        // Last Lapalcian layer is the same as the Gaussian layer
           orig_laplacian_pyramid.push_back(orig_guassian_pyramid[orig_guassian_pyramid.size()-1]);

        // Convolve laplacian original with guassian weights
        vector<Mat> convolved;
        for (int j = 0; j < maxPyrIndex + 1; j++) {
            // Create 3 channels for weight gaussian pyramid as well
            vector<Mat> gaussian_3d_vec;
            for (int k = 0; k < 3; k++) {
                gaussian_3d_vec.push_back(weight_gaussian_pyramid[j]);
            }
            Mat gaussian_3d;
            merge(gaussian_3d_vec, gaussian_3d);

            //Mat convolved_result = weight_gaussian_pyramid[j].clone();
            Mat convolved_result = gaussian_3d.clone();

            multiply(gaussian_3d, orig_laplacian_pyramid[j], convolved_result);
            convolved.push_back(convolved_result);
        }

        if (i == 0) {
            fused_pyramid = convolved;
        } else {
            for (int j = 0; j < maxPyrIndex + 1; j++) {
                fused_pyramid[j] += convolved[j];
            }
        }
    }
    // Blending
    for (int i = (int)fused_pyramid.size()-1; i > 0; i--) {
        Mat sized_up;
        pyrUp(fused_pyramid[i], sized_up, Size(fused_pyramid[i-1].cols, fused_pyramid[i-1].rows));
        fused_pyramid[i-1] += sized_up;
    }

    Mat final_color_bgr;
    fused_pyramid[0].convertTo(final_color_bgr, CV_32F, 255);
    final_color_bgr.copyTo(outputImage);

    imshow("final", outputImage);
    waitKey(0);
    imwrite(outputImagePath, outputImage);
}

該代碼對2張圖像進行了一些基本的金字塔混合。 關鍵問題與最后一行中的imshow和imwrite有關。 他們給了我截然不同的結果。 對於顯示如此長/混亂的代碼,我深表歉意,但我擔心這種差異來自代碼的其他某些部分,這些其他部分隨后可能會影響顯示和寫入。

基於給定的代碼,第一幅圖像顯示了imwrite的結果,第二幅圖像顯示了imshow的結果。 我很困惑為什么會這樣。 寫入結果imshow的結果

我還注意到當我執行這些操作時:

Mat float_image;
inputImages[i].convertTo(float_image, CV_32FC3, 1.0/255.0);
imshow("float image", float_image);
imshow("orig image", image);

它們顯示的是完全相同的東西,也就是說,它們都在原始rgb圖像(在圖像中)中顯示相同的圖片。

IMWRITE功能

默認情況下, imwrite會將輸入圖像轉換為僅8位(在PNG,JPEG 2000和TIFF情況下為16位無符號(CV_16U))單通道或3通道(“ BGR”通道順序)圖像可以使用此功能保存 因此,無論您輸入哪種格式進行寫入,它都會以BGR格式盲目轉換為CV_8U,范圍為0(黑色)-255(白色)。

IMSHOW-問題

因此,當注意到您的函數時, fused_pyramid[0].convertTo(final_color_bgr, CV_32F, 255); fused_pyramid已在墊子類型21(浮點CV_32F)下。 您嘗試使用比例因子255轉換為浮點。此比例因子255導致問題@ imshow。 取而代之的是,您可以直接輸入fused_pyramid而不進行轉換,因為它已經縮放到0.0(黑色)-1.0(白色)之間的浮點數。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM