在矩阵中绘制极坐标灰度值,无需对每个 for 循环进行插值

2024-01-19

我有一个矩阵,其灰度值介于0 and 1。对于矩阵中的每个条目,都有一定的极坐标来指示灰度值的位置。我已经有Theta and Rho值(极坐标),均位于单独的 512×960 矩阵中。和灰度值(在称为矩阵C)对于每一个Theta and Rho组合。我也有同样的X and Y,因为我刚刚使用pol2cart为了转型。问题是我无法直接绘制这些值,因为它们尚未适合新矩阵的“容器”。

我想要的:将灰度值放入大小为 1024×1024 的方阵中。我不能直接这样做,因为极坐标落在该矩阵的网格之间。因此,我们现在使用插值,但这非常耗时,并且必须对每个数据集单独完成,尽管从原始矩阵到最终矩阵的转换始终是相同的。因此,我想一次性求解该矩阵(无论是解析式还是数值式),并使用矩阵乘法或类似的方法在代码的每个周期中有效地应用操作。

这些转换之一可能如下所示的一个示例:

第一个矩阵中的零点是网格,值1(网格之间)是落在四个网格点之间的灰度值,然后我想转换为第二个矩阵(不介意点之间的视觉间距)。

对于每个数据集,我都有数百个这样的矩阵,因此我希望使代码更加高效。

背景:我正在使用TriScatteredInterp现在进行插值。我们尝试了scatteredInterpolant也是如此,但速度较慢。我也发帖了一个相关的问题 https://stackoverflow.com/questions/37170450/matlab-polar-coordinates-grey-scale-plot,但决定拆分这两种可能的解决方案,因为我在这里要求的解决方案也适用于非 MATLAB 代码,并且可能会更快,并且可以使代码执行更顺畅(不会连续弹出数字)。


使用图像处理工具箱

图像的工作方式与您拥有的数据略有不同。然而,将一种表示映射到另一种表示相当简单。

我只看到一个问题:包装。显然,θ = 2π = 0,但 MATLAB 并不知道这一点。 AFAIK,没有简单的方法可以告诉 MATLAB 这一点。

为什么这很重要?嗯,简单地说,像素间插值使用来自最近的信息N邻居寻找中间颜色,N取决于插值内核。在图像中间的某个位置执行此操作没有问题,但在边缘处,MATLAB 必须知道左边缘等于右边缘。这不是标准的图像处理,我不知道有任何功能可以做到这一点。

执行

现在,当忽略包装问题时,这是一种方法:

function resize_polar()

    %% ORIGINAL IMAGE
    % ==========================================================================

    % Some random greyscale data
    C = double(rgb2gray(imread('stars.png')))/255;

    % Your current size, and desired size    
    sz_x = size(C,2);    new_sz_x = 1024;
    sz_y = size(C,1);    new_sz_y = 1024;

    % Ranges for teat and rho;  
    % replace with your actual values
    rho_start = 0;     theta_start = 0;
    rho_end   = 10;    theta_end   = 2*pi;

    % Generate regularly spaced grid;
    theta = linspace(theta_start, theta_end, sz_x);
    rho   = linspace(rho_start,   rho_end,   sz_y);

    [theta, rho] = meshgrid(theta,rho);


    % Make plot of generated data
    plot_polar(theta, rho, C, 'Original image');

    % Resize data
    [theta,rho,C] = resize_polar_data(theta, rho, C, [new_sz_y new_sz_x]);

    % Make plot of generated data
    plot_polar(theta, rho, C, 'Rescaled image');

end


function [theta,rho,data] = resize_polar_data(theta,rho,data, new_dims)

    % Create fake RGB image cube 
    IMG = cat(3, theta,rho,data);

    % Rescale as if theta and rho are RG color data in the RGB
    % image cube
    IMG = imresize(IMG, new_dims, 'nearest');

    % Split up the data again
    theta = IMG(:,:,1);
    rho   = IMG(:,:,2);
    data  = IMG(:,:,3);

end

function plot_polar(theta, rho, data, label)

    [X,Y] = pol2cart(theta, rho);

    figure('renderer', 'opengl')
    clf, hold on

    surf(X,Y,zeros(size(X)), data, ...
         'edgecolor', 'none');     
    colormap gray

    title(label);

end

使用和绘制的图像:

Le awesomely-drawn 512×960 PNG image stars made with MS Paint

现在,两者看起来是一样的(实在找不到更合适的图像),所以你必须相信我,512×960 确实已经通过最近邻插值重新缩放到 1024×1024。

以下是实际的一些时间安排imresize()一些简单内核的操作:

nearest : 0.008511 seconds.
bilinear: 0.019651 seconds.
bicubic : 0.025390 seconds.  <-- default kernel

但这很大程度上取决于您的硬件;我相信imresize将大量工作转移到 GPU,因此如果你的 GPU 性能较差,它会变慢。

Wrapping

如果环绕问题对您来说确实很重要,您可以修改上面的函数以执行以下操作:

  • 首先,重新缩放图像imresize()像以前一样
  • 水平连接second灰度数据的一半和first一半。意思是,交换前半部分和后半部分,使左边缘和右边缘(0 和 2π)在中间接触。
  • 重新缩放该中间图像imresize()
  • 提取重新缩放的中间图像的中心垂直条
  • 将其分成两个等宽的条带
  • 并将输出图像的边缘条替换为您刚刚创建的两个条带

现在,这是一种蛮力方法:您正在重新缩放图像twice,第二轮图像的大部分像素将被丢弃。如果性能是一个问题,您当然可以仅将重新缩放应用于该中间图像的中央条带。但是,这会有点复杂。

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

在矩阵中绘制极坐标灰度值,无需对每个 for 循环进行插值 的相关文章

  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 如何使用最小生成树方法将边缘连接到图像中的节点

    我正在做我的手写图像图形匹配项目 我想在图形中表示给定的单词图像 我使用下面的算法 Algorithm input Binary image B Grid width w Grid height h Output Graph g V E w
  • 可以避免迭代元胞数组时的“s{1} 烦恼”吗?

    The s 1 标题的 烦恼 指的是下面的 for 块中的第一行 for s some cell array s s 1 unpeel the enclosing cell do stuff with s end This s s 1 业务
  • 当 MATLAB 变得非常非常忙时,如何中断它?

    我正在运行一个长时间的模拟MATLAB http en wikipedia org wiki MATLAB我意识到我需要停下来重新运行 然而 MATLAB 确实对这种计算很感兴趣 并且它停止了响应 如何在不终止 MATLAB 的情况下中断此
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • Matlab 的 fftn 在多线程下变得更慢?

    我可以访问 12 核机器和一些严重依赖 fftn 的 matlab 代码 我想加快我的代码速度 由于 fft 可以并行化 我认为更多的内核会有所帮助 但我看到的恰恰相反 这是一个例子 X peaks 1028 ncores feature
  • MATLAB 中的内存映射文件?

    我决定使用 memmapfile 因为我的数据 通常为 30Gb 到 60Gb 太大 无法放入计算机内存中 我的数据文件由两列数据组成 对应于两个传感器的输出 并且它们采用 bin 和 txt 格式 m memmapfile G E Str
  • 将球面坐标转换为笛卡尔坐标然后再转换回笛卡尔坐标并不能给出所需的输出

    我正在尝试编写两个函数来将笛卡尔坐标转换为球面坐标 反之亦然 以下是我用于转换的方程式 也可以在此找到维基百科页面 https en wikipedia org wiki Spherical coordinate system And 这是
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • 有没有办法在 MATLAB 中查看 pcode 文件 (.p) 的源代码?

    有没有办法在 MATLAB 中打开 pcode 文件 p 如果 开放 是指edit 那么当然不是 pcode 中的 p 代表 受保护 其主要设计目标是在保护其源代码的同时部署功能组件 如果 开放 是指run 那么当然是的 引用手册 http
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • glm 中矩阵值的顺序不正确?

    我开始使用GLM http glm g truc net通过 OpenGL 3 和 GLSL 进行数学运算的库 我需要正交投影来绘制 2D 图形 所以我编写了这个简单的代码 glm mat4 projection 1 0 projectio
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • numpy.linalg.inv() 是否给出了正确的矩阵逆?编辑:为什么 inv() 给出数值错误?

    我有一个矩阵形状 4000 4000 我想取逆矩阵 我对逆矩阵的直觉因如此大的矩阵而崩溃 起始矩阵的值大小为e 10 具有以下值 print matrix给出一个输出 2 19885119e 10 2 16462810e 10 2 1306
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 检查Matlab中脚本需要使用的函数

    我有一个别人写的代码包 我正在运行一个脚本 它调用一些函数 这些函数又调用更多函数 等等 我想获取不是 MATLAB 内置函数但属于包的一部分的函数列表 我尝试使用matlab codetools requiredFilesAndProdu
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo

随机推荐

  • 为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息

    TL DR如果我在 log4j2 xml 配置中使用带有嵌套 KeyValuePair 的 JsonLayout 则生成的日志消息为空 有什么想法吗 很长的故事 我正在使用 Tomcat 8 5 43 以及以下与日志记录相关的 JAR Ja
  • 超级循环编译错误

    我之前写过关于运行问题的文章超级高铁 https stackoverflow com questions 34817022 cant run hyperloop project项目 如果运行一个新创建的项目来添加我从 Appcelerato
  • 是否可以在没有 Mac 的情况下制作适用于 iOS 的 PhoneGap 应用程序?

    所以我有一个 HTML 5 应用程序 并且可以访问 Apple 开发人员中心 更准确地说是 iOS 开发中心 问题是我可以在不购买 借用 Mac 的情况下实际使用它吗 也就是说 我可以从 Windows 或 Linux 创建 下载我的开发人
  • 获取 OCIError: ORA-00932: Rails 3 中的数据类型不一致

    这是场景 我正在为 Ruby On Rails 编写 geo ruby oracle 适配器 它支持开箱即用地使用 SDO GEOMETRY 进展顺利 我编写了从 Oracle DB 成功选择 SDO GEOMETRY 对象的代码 当我想编
  • 人类可读的条形码与条形码平行放置

    以下是根据传递的 Id 生成条形码的代码 条形码生成良好 Override public byte generateBarcodeForId String Id throws VisitMastException BarcodeUtil u
  • Scala - 打印数组

    Scala 似乎缺乏对打印数组的支持 如果你打印一个 你会得到 Java 中的默认垃圾 scala gt val array Array fill 2 2 0 array Array Array Int Array Array 0 0 Ar
  • java.util.ConcurrentModificationException问题

    在此代码中 我收到 java util ConcurrentModificationException 该方法位于 Web 服务中 首先读取文件并检查 vakNaam 是否在文件中 然后它将被删除并且文件将被重写 异常由 Exception
  • 用于具体实现抽象类的构建器(Joshua Bloch 风格)?

    假设我有一个抽象类 BaseThing 它有一个必需参数 基本必需 和一个可选参数 基本可选 我有一个扩展它的具体类 Thing 它还具有一个必需参数 必需 和一个可选参数 可选 所以像这样 public abstract class Ba
  • C# - 如何调用添加到项目解决方案中的exe

    所以我在我的项目解决方案中添加了一个 EXE EXE 执行一些操作并通过 stdout 输出数据 我想捕获输出 但更重要的是如何在程序中执行该 EXE Process p new Process p StartInfo UseShellEx
  • C++ 检查前 5 个或后 5 个元素是否等于某个值

    有没有一种简单的方法可以在没有 for 循环或大量 if 和 else 的情况下做到这一点 那么例如 for i 0 i
  • 用于java的DAO生成器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找免费且简单的 Java DAO 生成器 它需要从数据库表 视图创建实体 本并生成基本的 CRU
  • 将图像转换为灰度

    我想将任何图像转换为灰度 但我不明白这些实现之间的区别 image cv2 imread lenna jpg gray cv2 cvtColor image cv2 IMREAD GRAYSCALE gray1 rgb2gray image
  • 将 String 类型引用标记为 Volatile 安全吗?

    我读过一些帖子和文章说我们不应该将java对象声明为易失性的 因为这样一来 只有引用变得易失性 这里有些例子 link 1 https stackoverflow com questions 15487544 declaring an ob
  • 如何清除 Dr. Racket IDE 中的解释器屏幕?

    刚刚开始接触 The Little Schemer 有一个非常基本的 Dr Racket IDE 问题 如何清除口译员屏幕 如何设置向上箭头来显示之前输入的项目 如 Bash 中 而不是当前向上滚动屏幕的行为 我的搜索结果一片空白 可能是因
  • 如何根据键值更新 javascript 数组中的行?

    我有一个这样的数据数组 var nameInfo name Moroni age 50 name Tiancum age 43 name Jacob age 27 name Nephi age 29 name Enos age 34 如果我
  • 添加迁移给出的文件名已经存在

    我已经启用了这样的迁移 enable Migrations ProjectName ProjectOne ContextTypeName MyIdentity Config MyIdentityContext MigrationsDirec
  • 使用 awscli 更新 cloudfront 配置

    我想使用 awscli 编辑 更新我的 CloudFront 发行版 我正在使用最新的 cli 版本 aws cli 1 11 56 Python 2 7 10 Darwin 16 4 0 botocore 1 5 19 要在 awscli
  • 将图像转换为灰度

    有没有办法将图像转换为每像素 16 位灰度格式 而不是将每个 r g 和 b 分量设置为亮度 我目前有一个 bmp 文件 Bitmap c new Bitmap filename 我想要一个位图 d 即 c 的灰度版本 我确实看到一个包含
  • Clojure:更新记录字段的值

    我已定义记录来存储用户详细信息和地址详细信息 defrecord User id name address defrecord Address id location street city state def usr User 1 Abc
  • 在矩阵中绘制极坐标灰度值,无需对每个 for 循环进行插值

    我有一个矩阵 其灰度值介于0 and 1 对于矩阵中的每个条目 都有一定的极坐标来指示灰度值的位置 我已经有Theta and Rho值 极坐标 均位于单独的 512 960 矩阵中 和灰度值 在称为矩阵C 对于每一个Theta and R