使用图像处理工具箱
图像的工作方式与您拥有的数据略有不同。然而,将一种表示映射到另一种表示相当简单。
我只看到一个问题:包装。显然,θ = 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
现在,两者看起来是一样的(实在找不到更合适的图像),所以你必须相信我,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,第二轮图像的大部分像素将被丢弃。如果性能是一个问题,您当然可以仅将重新缩放应用于该中间图像的中央条带。但是,这会有点复杂。