同时重新排序和旋转图像的高效方法

2024-05-08

为了快速加载 jpeg,我为turbojpeg 实现了一个 .mex-wrapper,以有效地将(大)jpeg 读入 MATLAB。对于 4000x3000px 的图像,实际解码只需要大约 120 毫秒(而不是 5 毫秒)。然而,像素顺序是 RGBRGBRGB... ,而 MATLAB 需要一个 [W x H x 3] 矩阵,在内存中是一个 W*H*3 数组,其中第一个 WH 条目对应于红色,第二个 WH 条目对应于红色。绿色,最后的 WH 条目为蓝色。 此外,图像围绕从左上到右下的轴进行镜像。

重排循环的简单实现如下:

// buffer contains mirrored and scrambled output of turbojpe
// outImg contains image matrix for use in MATLAB
// imgSize is an array containing {H,W,3}
for(int j=0; j<imgSize[1]; j++) {
    for(int i=0; i<imgSize[0]; i++) {
        curIdx = j*imgSize[0] + i;
        curBufIdx = (i*imgSize[1] + j)*3;
        outImg[curIdx] = buffer[curBufIdx++];
        outImg[curIdx + imgSize[0]*imgSize[1] ] = buffer[curBufIdx++];
        outImg[curIdx + 2*imgSize[0]*imgSize[1] ] = buffer[curBufIdx];    
    }
}

它可以工作,但需要大约 120 毫秒(而不是 20 毫秒),大约与实际解码一样长。关于如何使这段代码更高效有什么建议吗?

由于错误,我更新了处理时间。


EDIT:99% 的 C 库将以行优先存储图像,这意味着如果您从 Turbojpeg 获得 3 x WH(二维数组),您可以将其视为 3 x W x H(上面的预期输入)。在此表示中,像素先横向读取,然后向下读取。您需要它们在 MATLAB 中向下阅读。您还需要将像素顺序 (RGBRGBRGB...) 转换为平面顺序 (RRRR....GGGGG....BBBBB...)。解决办法是permute(reshape(I,3,W,H),[3 2 1]).


这是 MATLAB 的情况之一permute http://www.mathworks.com/help/matlab/ref/permute.html命令可能会比您在短时间内手动编写的任何代码都要快(比所示的循环至少快 50%)。我通常会避开以下解决方案mexCallMATLAB http://www.mathworks.com/help/matlab/apiref/mexcallmatlab.html,但我认为这可能是一个例外。然而,输入是一个mxArray,这可能会带来不便。无论如何,这是如何做的permute(I,[3 2 1]):

#include "mex.h"

int computePixelCtoPlanarMATLAB(mxArray*& imgPermuted, const mxArray* img)
{
    mxArray *permuteRHSArgs[2];
    // img must be row-major (across first), pixel order (RGBRGBRGB...)
    permuteRHSArgs[0] = const_cast<mxArray*>(img);
    permuteRHSArgs[1] = mxCreateDoubleMatrix(1,3,mxREAL);

    // output is col-major, planar order (rows x cols x 3)
    double *p = mxGetPr(permuteRHSArgs[1]);
    p[0] = 3;
    p[1] = 2;
    p[2] = 1;

    return mexCallMATLAB(1, &imgPermuted, 2, permuteRHSArgs, "permute");
}

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
    // do some argument checking first (not shown)
    // ...

    computePixelCtoPlanarMATLAB(plhs[0], prhs[0]);
}

Or call permute(I,[3 2 1])回到 MATLAB 中。

关于reshape首先从 3xWH 变为 3xWxH?只要告诉代码,它真的是 3xWxH!reshape不移动任何数据-- 它只是告诉 MATLAB 将给定的数据缓冲区视为特定大小。

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

同时重新排序和旋转图像的高效方法 的相关文章

随机推荐

  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 将 KeyUp 作为参数传递 WPF 命令绑定文本框

    我有一个文本框 KeyUp 事件触发器连接到 WPF 中的命令 我需要将按下的实际键作为命令参数传递 该命令执行得很好 但处理它的代码需要知道按下的实际键 记住这可能是一个回车键或不仅仅是一个字母的任何键 所以我无法从 TextBox te
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • nested_form/cocoon:可以将表行用于嵌套字段吗?

    我通常不使用表格作为表单 但是当有嵌套表单时 使用nested form或cocoon gem时 可以将每组表单元素放在表格行中吗 对我来说 这似乎非常直观 表中的每一行都代表一个对象 但是 nested form 和 cocoon gem
  • 提取 zip 文件时 Parallel.ForEach 抛出异常

    我正在阅读 zip 文件的内容并尝试提取它们 var allZipEntries ZipFile Open zipFileFullPath ZipArchiveMode Read Entries 现在 如果我提取使用 Foreach 循环
  • ASP.NET 中的 JavaScript 事件处理程序

    我有以下 iframe 控件 旨在成为类似 facebook 的按钮 iframe gt 我在上面定义了 javascript 函数 如下所示
  • 来自 geoJSON 的 Google 地图航点

    我想从 geoJSON 文件加载行程 目前来说 它是有效的 但只有两点 但我需要添加 4 或 5 个航路点 我的代码只读取前两个点并将它们设置为起点和目的地 这是我的代码 google maps event addListener map
  • 如何从 SQL Server 的表中获取列名?

    我想查询一个表的所有列的名称 我发现如何做到这一点 Oracle https stackoverflow com q 452464 419956 MySQL https stackoverflow com q 193780 419956 P
  • jQuery UI 和原型冲突

    我正在 Perl 中向我们的网站添加一个新表单 不是我的选择 表单会自动生成大量 html 以创建一致的外观 我的问题在于遗留系统在整个页面 包括加载时 中使用原型来处理各种事情 不过我想使用 jQuery 主要是 jQuery UI 中的
  • 在 Android 中使用 SQL (JDBC) 数据库

    在旧的 Java 应用程序中 我使用以下代码连接到 SQL 数据库并将其用于某些查询 private Connection dbConnection null System setProperty derby system home C C
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 将 ASP.NET TextBox 呈现为 HTML5 输入类型“Number”

    当 ASP NET TextBox 呈现时 它会生成
  • 如何获取Oracle中命名事务的名称?

    我想在触发器中使用事务的名称 以便将其写入列中 我尝试了这个 在 SQL Developer 中 set transaction name hello select DBMS TRANSACTION LOCAL TRANSACTION ID
  • 如何在 Windows 上为“flask run”设置环境变量?

    我刚刚开始学习 Flask 我一直停留在设置 Flask 环境变量上 我不知道如何设置环境变量 每当我使用flask run命令 我遇到以下错误 错误消息 无法找到 Flask 应用程序 您没有提供 FLASK APP 环境变量 并且在当前
  • 所有人共享的 First Load JS 在 next.js 中相当重

    I have a project on Next js framework and the problem is that First Load JS shared by all pages is rather heavy I want t
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • Python 中的数据可用性图表

    我想知道Python是否有一些东西可以绘制具有多个变量的时间序列的数据可用性 下面显示了一个示例 取自Visavail js 时间数据可用性图表 https github com flrs visavail 1 description 以下
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R