为什么在这个带有export_fig的Matlab Polar演示文稿中有Gap?

时间:2016-10-10 17:37:58

标签: matlab matlab-figure polar-coordinates

从origo(0,0)到(1,0)的行产生间隙的代码,如果C维度达到无穷大,则似乎达到零;但是,我无法用任何大小的C来得到它,所以我认为工件可能是由Matlab图形内部特征或图像数据本身(AnderBiguri)引起的,因为img=imread('peppers.png')似乎没有出现这种情况。 。 制作图像的代码,按export_fig存储它并将其从笛卡尔映射到Polar,其中发生伪像

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]); % http://stackoverflow.com/a/15529630/54964
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');
% http://stackoverflow.com/a/7586650/54964
[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]

时的输出

enter image description here enter image description here

Matlab:2016a
Export_fig:08/08/16版本
操作系统:Debian 8.5 64位
Linux内核:4.6的backports
硬件:华硕Zenbook UX303UA

2 个答案:

答案 0 :(得分:5)

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

如果使用

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

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

enter image description here

这就是它被转化为极地情节中失踪的乐队。如果您只删除大小为1的图像周围的边框,则会得到完整的图。

我最好的猜测是在export_fig内的任何地方,你的陈述% by default, export_fig has cropping都是假的,或者裁剪有一些小错误,并从背景中获取1个像素。

答案 1 :(得分:0)

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

  1. 我正在尝试从现有图像(即图像数据)创建极坐标变换(扭曲)。
  2. 我使用export_fig导出图片。我对轴或边框不感兴趣,只对图像数据感兴趣,所以我通过了适当的选项来摆脱它们。
  3. 当我在稍后的步骤中阅读生成的文件,并尝试创建我的极地转换时,我得到了一个奇怪的神器。
  4. 为什么会发生这种情况,如何摆脱它以获得干净的极地情节。
  5. 如果实际这个问题,那么我建议您不要使用export_fig,因为它不是为了保存图像数据而设计的保存数字。也就是说,它是具有大量自定义功能的print函数的包装器,可以生成您将在出版物中使用的内容。它应用适当的边框,分辨率,保留轴,网格等等。在这种特殊情况下,您可以选择在输出图像的底部添加1像素厚度的白色边框。 (是的,这可能是也可能不是错误,值得向作者报告)。

    因此,如果您实际要做的是保存图像数据(即原始像素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);
    

    导致:

    enter image description here

    无论其

    这个问题措辞严厉。在对原始问题进行了许多不幸的激烈评论和编辑之后,在我看来,现在的实际问题似乎是:

    1. 我正在使用export_fig函数 专门 (由于我不想进入的原因)而我正在尝试使用它仅导出图像数据
    2. 输出图像有一个奇怪的“1像素厚底边框”伪影。
    3. 我可以更清楚地在视觉上证明这一点,你们可以把它变成极地情节(但极地情节本身不是我关心的出版物)。
    4. 这是export_fig中的错误,如果我向作者报告,有没有办法绕过它?
    5. 在这种情况下答案是“是的,这完全是一个错误,你应该报告它。”

      (此外,如果这真的是 您要问的问题的版本,请做出额外的努力,以便在将来更清楚地说明您的问题,明确说明您要解决的问题并采取措施,以避免浪费人们的时间来回答错误的事情,并进行激烈的讨论。)