为什么这个 Matlab Polar 演示文稿中有 export_fig 的差距?

Why is there Gap in this Matlab Polar presentation with export_fig?

在原点 (0,0) 到 (1,0) 的直线上产生间隙的代码,如果 C 维度达到无穷大,该间隙似乎达到零;然而,我不能用任何大小的 C 让它足够小所以我认为伪影可能是由 Matlab 图形内部特征或图像数据本身 (AnderBiguri) 引起的,因为它似乎不会发生 img=imread('peppers.png') . 制作图像的代码,通过 export_fig 存储并将其从笛卡尔映射到出现伪影的极坐标

close all; clear all; clc;

%% Make image
f1=figure;
hax=axes(f1);
x = rand(1,6);
y = exp(rand(1,181));
C = rand(3613,3613);
imagesc(hax, x, y, C); 
box(hax, 'off');
axis(hax, 'off');
set(hax, 'yTickLabel', []);
set(hax, 'xTickLabel', []); % for polar presentation
set(hax, 'Ticklength', [0 0]); % 
filename='/home/masi/Images/testi';
% by default, export_fig has cropping
[img, alpha] = export_fig(filename, '-png', '-native', '-q101', '-a1', '-m1', '-RGB', '-nofontswap', '-dpng', hax);
close all; 

%% Read Image
img=imread('/home/masi/Images/testi.png');
% 
[h,w,~] = size(img);
s = min(h,w)/2; % have here .../1, some phenomenon occurs
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi,s));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));
subplot(121), imshow(img)
subplot(122), warp(x, y, z, img)
view(2), axis square tight off

图1 size(C)=[3613 3613]时输出, 图2 size(C)=[36130 36130]

时的输出

Matlab: 2016a
Export_fig: 08/08/16 版本
OS:Debian 8.5 64 位
Linux 内核:向后移植 4.6
硬件:华硕 Zenbook UX303UA

我快速浏览了一下,是的,发生了一些奇怪的事情。问题是你的图像周围有一个边框,在绘制 image 时似乎没有边框,因为它与背景颜色相同!

如果您使用

创建图像
C = rand(100,100);

然后在用 imagesc 而不是 imshow 加载后绘制它,你可以看到这个:

这就是它被翻译成极坐标图中缺失的波段的原因。如果您只是删除尺寸为 1 的图像周围的边框,您将得到完整的绘图。

我最好的猜测是 export_fig 中的某处您的陈述 % by default, export_fig has cropping 是错误的,或者裁剪有一些小错误并且从背景中获取了 1 个像素。

从原文来看,我理解你的问题是:

  1. 我正在尝试从现有图像(即图像数据)创建极坐标变换(扭曲)。
  2. 我使用 export_fig 导出图像。我对轴或边框不感兴趣,只对图像数据感兴趣,所以我传递了适当的选项来摆脱这些。
  3. 当我在后面的步骤中读取生成的文件并尝试创建我的极坐标变换时,我得到了一个奇怪的工件。
  4. 为什么会发生这种情况,我怎样才能摆脱它以获得干净的极坐标图。

如果这实际上是个问题,那么我建议你不要为此使用export_fig,因为它不是为了保存图像而设计的data,它保存了一个。也就是说,它是 print 函数的包装器,具有大量定制功能,可生成您将在出版物中使用的内容。它应用适当的边框、分辨率、保留轴、网格等。在您选择的这种特殊情况下,它似乎在输出图像的底部添加了一个 1 像素粗的白色边框。 (是的,这可能是也可能不是错误,值得向作者报告)。

因此,如果您实际想要做的是保存图像 data(即原始像素 rgb 值),您应该使用 imwrite。完整示例,改编自您的代码:

close all; clear all; clc;

%% Make image
f1 = figure; hax = axes();
x = rand(1,6); y = exp(rand(1,181)); % image placement
C = rand(3613,3613);                 % image data
imagesc(x, y, C); 
colormap parula(256); % The colormap in the example (default since 2014b)
box(hax, 'off'); axis(hax, 'off');
set(hax, 'yTickLabel', [], 'xTickLabel', [] , 'Ticklength', [0 0]);
filename='testi.png';

% convert grayscale image to rgb to preserve "colormap" in output file
Cind = gray2ind(C, 256); Crgb = ind2rgb(Cind, parula(256));
imwrite(Crgb, filename, 'png');

%% Read image
img=imread('testi.png');
[h,w,~] = size(img); s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi,s));
[x,y] = pol2cart(theta, rho); z = zeros(size(x));
subplot(1, 2, 1); imagesc(img); axis image off;
subplot(1, 2, 2); warp(x, y, z, img); view(2); axis image off;
colormap parula(256);

导致:

然而

问题措辞不当。在对原始问题进行了大量不幸的激烈评论和编辑之后,在我看来,实际问题现在似乎是:

  1. 我正在使用 export_fig 功能 具体 (出于我不想深入的原因)和我正在尝试使用它来仅导出图像数据
  2. 输出图像有一个奇怪的“1 像素厚的底部边框”伪像。
  3. 我可以更清楚地向你们展示这一点,购买将其转换为极坐标图(但极坐标图本身并不是我在出版物中关心的内容)。
  4. 这是 export_fig 中的错误吗,我应该向作者报告它吗?有没有办法解决它?

在这种情况下,答案是 "yes this is totally a bug and you should report it"。


(此外,如果这真的 您所问问题的版本,请在以后更加清楚地表述您的问题,清楚地说明您遇到的问题正在尝试解决并采取措施,避免浪费人们的时间回答错误的事情,并无缘无故地进行激烈的讨论。)