【问题标题】:Plot digitization in MATLAB using ginput使用 ginput 在 MATLAB 中绘制数字化图
【发布时间】:2016-04-07 08:36:22
【问题描述】:

我正在尝试使用 MATLAB 将此图像数字化:

我有以下脚本:

%// Get data from plot
clear all; close all;
%// Input
fname = 'Fig15a.PNG'; 
 xvec = [1e3:1:1e8]; 
 yvec = [1e-4:1:1e-1]; 
   xt = [1e3 1e4 1e5 1e6 1e7 1e8]; 
   yt = [1e-4 1e-3 1e-2 1e-1];

%// Read and plot the image
im = imread(fname);
figure(1), clf
im = im(end:-1:1,:,:);
image(xvec,yvec,im)
axis xy; 
grid on;

%// Set ticks
set(gca,'xtick',xt,'ytick',yt); %// Match tick marks

%// Collect data
[x,y] = ginput; %// Click on points, and then hit ENTER to finish

%// Plot collected data
hold on; plot(x,y,'r-o'); hold off;

%// Then save data as:
save Fig15a.mat x y

脚本运行良好

有没有办法可以将 xy 轴更改为对数刻度? 我试过在不同的地方添加以下代码,但没有运气:

%// Set Log scale on x and y axes
set(gca,'XScale','log','YScale','log');

【问题讨论】:

  • 你为什么不使用现有的工具呢?例如。 this
  • 谢谢,不知道现有的工具。盲目地跟随我的主管使用 MatLab :) 出于好奇知道这在 MatLab 中是否可行

标签: matlab image-processing plot axes ginput


【解决方案1】:

以下是一个概念证明,可以帮助您走上正轨。我已将您原始代码中的内容替换为我认为的“良好做法”。

function q36470836
%% // Definitions:
FIG_NUM = 36470836;
%% // Inputs:
fname = 'http://i.stack.imgur.com/2as4t.png'; 
xt = logspace(3,8,6);
yt = logspace(-4,-1,4);
%% // Init
figure(FIG_NUM); clf
% Read and plot the image
im = imread(fname);
hIMG = imshow(im); axis image;

%// Set ticks
hDigitizer = axes('Color','none',...
                  'XLim',[xt(1) xt(end)],'YLim',[yt(1) yt(end)],...
                  'XScale','log','YScale','log',...
                  'Position',hIMG.Parent.Position .* [1 1 696/785 (609-64+1)/609]);

uistack(hDigitizer,'top'); %// May be required in some cases
grid on; hold on; grid minor;

%// Collect data:
[x,y] = ginput; %// Click on points, and then hit ENTER to finish

%// Plot collected data:
scatter(x,y,'o','MarkerEdgeColor','r');

%// Save data:
save Fig15a.mat x y

下面是一个例子:

几点说明:

  • xtyt 可以使用 logspace 以更简洁的方式创建。
  • 很难(可能不可能)将数字化网格与图像正确对齐,这将不可避免地导致数据错误。尽管这在以下情况下会有所帮助(您需要矢量图形编辑器,例如免费软件 InkScape):
    1. 如果您有任何机会从 PDF 文件中获取此图像,该图像显示为矢量图像(您可以通过放大来测试此图像,而不会使图表变得像素化;这 似乎 从.png 的外观来看是您的情况),您最好将其保存为矢量图像,然后您有两个选择:
      • 将图像导出为分辨率大大提高的位图,然后再次尝试数字化过程。
      • 将矢量图像保存为.svg,然后使用您喜欢的文本编辑器打开文件并获取点的确切坐标。
    2. 如果源图像是位图(而不是矢量图形),您可以"trace the bitmap",从而将其转换为矢量,然后#GOTO 步骤 1。
  • 此解决方案(当前)不支持调整图形大小。
  • Position 设置中出现的幻数是下图中解释的比例因子(size(im) 也是[609 785 3])。从技术上讲,这些可以使用“原始图像处理”找到,但在这种情况下,我只是明确地对它们进行硬编码。

【讨论】:

    【解决方案2】:

    你可以用双对数刻度绘制

    loglog(x,y);
    

    help loglog 或文档提供更多信息。

    对于单个对数刻度使用

    semilogx(x,y);
    semilogy(x,y);
    

    【讨论】:

    • 我的问题不是在本地比例上绘图,而是在导入我的图像时设置本地比例image(xvec,yvec,im)
    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2015-07-24
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多