[英]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.