c++ - FreeImage+OpenCV - 16 位图像扭曲

2023-12-14

我正在尝试加载图像,因为我必须对其应用算法。 如果我加载每通道 8 位图像,则没有问题,但如果我加载 16bpc 图像,则会“毁掉”。不幸的是,由于我没有足够的声誉,我无法上传图像。

这些是它们的链接:

源和 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 = %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,因为 OpenCVMats 为 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 图像只是为了翻转它,并让 OpenCVMat要做到这一点:

#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); before imshow.

或者你可以参考this将所有类型的 FreeImage 转换为 OpenCV 的函数的答案Mats.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ - FreeImage+OpenCV - 16 位图像扭曲 的相关文章

随机推荐

  • eras light itc 的 CSS 代码

    谁能给出 eras light ITC 字体的css编码 我无法得到它 编码是 para quote padding right 30px font family sans serif font weight 100 我想要eras lig
  • jQuery:$().click(fn) 与 $().bind('click',fn);

    当使用 jQuery 连接事件处理程序时 使用 click 方法有什么区别 click fn 与使用绑定方法相比 bind click fn 除了绑定的可选数据参数之外 对于它的价值 从jQuery 源代码 jQuery each blur
  • PHPMailer 收件人地址上的字符 ñ

    当我尝试将电子邮件发送到包含字母 的收件人地址时 我在 phpmailer 上收到下一个错误 例如 致命错误 未捕获异常 phpmailerException 并带有消息 无效地址 lauro mu 电子邮件受保护 我知道它说这是一个无效地
  • 我可以通过任何方式检测驱动程序签名策略状态吗?

    我有一个修改过的驱动程序 并且必须在禁用驱动程序签名时安装 因此我想检测此状态以提醒用户重新启动到安全模式 我试过这个命令 Bcdedit exe set TESTSIGNING OFF 但是失败并提示 设置元素数据时发生错误 该值受安全启
  • Django 和 HTML 数组

    我有一个包含以下输入的表单
  • Pig、Cassandra 和 DataStax 拆分控制

    我一直在使用 Pig 和我的 Cassandra 数据来完成各种令人惊奇的分组壮举 而这些壮举几乎不可能用命令式的方式编写 我正在使用 DataStax 的 Hadoop 和 Cassandra 集成 我不得不说它令人印象深刻 向那些家伙致
  • Ajillion PHP-MySQLi-数据库类更新命令

    使用 Ajillion 制作的 MySQLi 类 https github com ajillion PHP MySQLi Database Class 我想执行以下命令 command UPDATE sessions SET active
  • 如何从 Mayavi GUI 加载 CSV 文件?

    我知道如何将 CSV 读入 numpy 并通过 Python 脚本执行此操作 这对于我的用例来说已经足够了 但由于它有一个具有数据加载功能的 GUI 我希望它能够适用于这种通用数据格式 所以我尝试进入菜单 File 加载数据 打开文件 但是
  • 使用 Func<> 提高代码可读性的机会

    今天我终于 得到 了Func lt gt delegate 并了解了如何使用它来使我的一些可读性较差的 LINQ 查询 希望如此 更具可读性 这是一个简单的代码示例 以 非常 简单的示例说明了上述内容 List
  • T-SQL 中的“WHERE IN”[重复]

    这个问题在这里已经有答案了 可能的重复 参数化 SQL IN 子句 是否可以使用查询参数来填充IN关键字 您好 我在 SQL 查询中使用 WHERE IN 因为用户可能需要输入多个 id 来显示 的记录 以逗号分隔 我现在有这个 WHERE
  • 骨干模型保存

    我正在使用 Rails 并学习 Backbone 请帮帮我 有什么方法可以在保存时设置正确的模型吗 例如 当我创建带有一些参数的新用户并尝试将其保存到数据库中时 在服务器端 我没有将用户作为对象 而是将用户字段保存在参数中 保存用户的唯一方
  • 如何在java中使用fiddler捕获https

    我正在 Eclipse IDE 中运行以下 java 程序 import java net import java io public class HH public static void main String args throws
  • 默认整数值是什么?

    我在某处读到默认浮点值 例如1 2 are double not float 那么默认整数值是多少6 他们是short int or long 以 10 为基数给出的整数文字类型是以下列表中其值可以容纳的第一个类型 int long int
  • Spidermonkey 上的垃圾收集器问题...JS_AnchorPtr()?

    我推出了自己的 javascript 服务器端语言 称为 bondi 最近刚刚升级到新的蜘蛛猴 现在JS进入本地根和离开本地根的功能从1 8 5 api中消失 无用了 只使用锚点指针就足够了 JS AnchorPtr varname 在函数
  • Jasper Reports 中的子报表

    我有两个表格要打印在同一页上 这些表的数据将从自定义数据源的地图中提供 我需要实施它 我用谷歌搜索来实现这个任务 当时我遇到了子报告的概念 但我没有得到太多关于如何实现子报告的信息 我知道如何创建子报告 但我不知道如何使用自定义数据源填充子
  • jQuery UI 滑块 -> 支持鼠标滚轮?

    你可能已经知道我是 jQuery 的新手 所以不属于这个主题的代码改进仍然是非常允许的 这是我的 HTML 代码 div style display inline block width 120px div Bananas br div d
  • jasypt-spring-boot-1.17:属性解密失败,请确保加密/解密密码匹配

    我有 jasypt spring boot 1 17 带有 spring 版本 4 2 5 RELEASE 和 spring Boot 版本 1 5 3 RELEASE 我正在使用该网站的第一种方法 https github com uli
  • JavaScript 中同一行的多个比较/赋值运算符

    function test input var value input 1 在上面 函数内部的代码行在做什么以及它是如何工作的 首先是进行比较input 1 然后分配其结果 这将是true or false 变量value The is a
  • 如何自定义 HTML5 日期选择器

    我试图了解如何以特定方式自定义 HTML5 日期选择器 特别是格式类似于 日历图标 8 月 31 日 星期二右侧插入符号将打开日期选择器 经过一些初步搜索后 我找到了这些用于自定义日期输入文本框的伪元素 webkit datetime ed
  • c++ - FreeImage+OpenCV - 16 位图像扭曲

    我正在尝试加载图像 因为我必须对其应用算法 如果我加载每通道 8 位图像 则没有问题 但如果我加载 16bpc 图像 则会 毁掉 不幸的是 由于我没有足够的声誉 我无法上传图像 这些是它们的链接 源和 8bpc 处理结果 http post