簡體   English   中英

C ++-FreeImage + OpenCV-16位圖像失真

[英]c++ - FreeImage+OpenCV - 16bit image get distorted

我正在嘗試加載圖片,因為我必須對其應用算法。 如果加載每通道8位的圖像沒有問題,但是如果加載16bpc的圖像,則會“損壞”。 不幸的是,由於我沒有足夠的聲譽,所以我無法對圖像進行翻版。

這些是它們的鏈接:

源和8bpc處理結果

http://postimg.org/image/gc0zf2lp5/

..result如果我處理保存為16bpc的相同圖像

http://postimg.org/image/5nnwee7df/

這是代碼:

FreeImage_Initialise();
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType(argv[1], 0);
FIBITMAP* imagetmp = FreeImage_Load(format, argv[1]);
FIBITMAP* image = FreeImage_Rotate(imagetmp, 180);
FreeImage_FlipHorizontal(image);
int depth = FreeImage_GetBPP(image);
printf("depth = %d\n", FreeImage_GetPitch(image));
cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(depth/3, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
FreeImage_DeInitialise();

會是什么呢?

depth值不是您所期望的。 它指的是OpenCV深度,定義為:

#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6

因此,如果您知道FreeImage的類型為FIT_RGB16 ,則應使用值CV_16U作為深度。 您還應該從RGB轉換為BGR,因為OpenCV Mat為BGR格式。

這里的例子:

#include <FreeImage.h>
#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    FreeImage_Initialise();
    FREE_IMAGE_FORMAT format = FreeImage_GetFileType("path_to_image", 0);
    FIBITMAP* imagetmp = FreeImage_Load(format, "path_to_image");
    FIBITMAP* image = FreeImage_Rotate(imagetmp, 180);
    FreeImage_FlipHorizontal(image);
    int depth = FreeImage_GetBPP(image);
    printf("depth = %d\n", FreeImage_GetPitch(image));

    // FreeImage to Mat conversion
    cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(CV_16U, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
    cvtColor(img, img, CV_BGR2RGB);

    FreeImage_DeInitialise();

    return 0;
}

請注意,您還可以避免創建另一個FreeImage圖像以使其翻轉,而讓OpenCV Mat這樣做:

#include <FreeImage.h>
#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{       
    FreeImage_Initialise();
    FREE_IMAGE_FORMAT format = FreeImage_GetFileType("path_to_image", 0);
    FIBITMAP* image = FreeImage_Load(format, "path_to_image");

    // FreeImage to Mat conversion
    cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(CV_16U, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
    cvtColor(img, img, CV_BGR2RGB);
    flip(img,img,0);

    FreeImage_DeInitialise();

    return 0;
}

您不能使用cv::imshow直接顯示此圖像。 您需要將其轉換為CV_8UC3類型才能看到它。 您可以執行此操作,例如調用convertScaleAbs(img, img); imshow

或者,您可以參考答案以獲取將所有類型的FreeImage轉換為OpenCV Mat的功能。

暫無
暫無

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

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