FreeImage+OpenCV - 16位图像失真
FreeImage+OpenCV - 16bit image get distorted
我正在尝试加载图像,因为我必须在其上应用算法。如果我加载一个每通道8比特的图像没有问题,但是如果我加载一个每通道16比特的图像,那么它就会被"破坏"。不幸的是,由于我没有足够的声誉,我不能上传图片。
这些是它们的链接:
源和8bpc处理结果
http://postimg.org/image/gc0zf2lp5/. .结果如果我处理相同的图像保存为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 = %dn", 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
s是BGR格式。
例子:
#include <FreeImage.h>
#include <opencv2opencv.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 = %dn", 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 <opencv2opencv.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
类型才能看到它。您可以这样做,例如在imshow
之前调用convertScaleAbs(img, img);
。
或者你可以参考这个函数的答案,将所有类型的FreeImage转换为OpenCV Mat
s。
相关文章:
- 将浮动的heightmap数组导出为16位原始值
- 宽度为奇数的16位纹理为片状
- OpenGL 16 位模板缓冲区?
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- OpenCV 实感 16 位深度图像
- 使用 C++ 从 16 位数据创建灰度图像
- 24位图图像和16位图图像中的RGB颜色
- 使用16位签名格式打开CV不起作用..裁剪图像并重新调整图像大小
- 将 16 位单通道图像写入 Tiff
- 如何将图像中的每个像素作为16位索引存储到颜色表中
- 将图像读入<Mat> vec 16 位错误
- 使用 C++ 和 Qt 如何将 16 位原始文件显示为图像
- Qt 5 带有 QOpenGLTexture 和 16 位整数图像
- OpenCV(C++):如何保存16位图像
- 如何在OpenCV中将16位图像转换为32位图像
- 用C++编写OpenEXR 16位图像文件
- 将16位灰度DICOM图像转换为8位:正确的步骤
- 用GDAL和OpenCV编写RGB 16位图像
- FreeImage+OpenCV - 16位图像失真
- 图像处理-将矩阵中的16位写入文本文件,并用C++以不同的方式读取