如何将独特的图像格式添加到Matlab的imread和拖放功能中?

7
我们有许多内部图像格式需要在Matlab中处理。 我已经为它们编写了读/写函数。 以TGA图像格式为例,可以使用文件交换image reader来进行处理。
Matlab对于imread支持的图像格式具有合理的拖放支持。
也就是说,您可以从资源管理器中拖动图像,将其放在“工作区”窗格上,然后Matlab会读取该图像,并将其复制到您的工作区。
我想添加拖放支持和TGA文件的imread支持(例如,imread具有很好的自动完成文件名功能,而tga_read_image没有)。
3个回答

4
我认为这个链接可能是你在寻找的内容。以下是官方文档的引用:

open命令可以打开相应文件或变量并在合适的应用程序中显示。

你可以通过定义自己的处理方法openxxx来扩展open的功能,其中xxx是一个文件扩展名。例如,如果你创建了一个名为openlog的函数,则open函数会调用openlog来处理任何具有.log扩展名的文件。open函数返回由你的函数定义的任何单一输出。

例如:
function opentga(file) 
    % Your logic for reading and, eventually,
    % displaying TGA files when drag and drop
    % or other opening events occur.
end

以下是直接取自链接的完整可工作示例:

function opentxt(filename)
   [~, name, ext] = fileparts(filename); 
   fprintf('You have requested file: %s\n', [name ext]);

   if exist(filename, 'file') == 2
     fprintf('Opening in MATLAB Editor: %s\n', [name ext]);
     edit(filename);
   else
      wh = which(filename);
      if ~isempty(wh)
         fprintf('Opening in MATLAB Editor: %s\n', wh);
         edit(wh);
      else
        warning('MATLAB:fileNotFound', ...
                'File was not found: %s', [name ext]);
      end
   end
end

另一种方法是通过重载uiopen函数来实现,如文件交换发布中所示。


opentga可以使用“open”命令,这解决了我的一些问题(例如合理的自动文件名完成)。但是,它并不能解决我所有的问题,例如拖放功能。我还没有测试过覆盖uiopen,但我的问题是,它需要用户仔细管理他们的路径,而他们不这样做,并且每当建议时都会强烈反对。 - John
有趣的是,使用上面的例子,每当我将一个文本文件放入Matlab工作区时,自动拖放加载对我来说都很好用。 - Tommaso Belluzzo
就路径管理而言,为了避免任何潜在的反叛,您可以告诉用户将自定义打开函数放入文件夹中(例如Matlab安装路径中的一个安全文件夹),并使用addpath进行注册。这将使其无论位于何处都能正常工作,并且用户将忘记它的存在。 - Tommaso Belluzzo
你使用的 matlab 版本是什么?拖放功能无法加载我的 tga 文件(它认为 tga 是文本文件,并没有调用 opentga)。我在 2016b 和 2017b 中都遇到了这个问题。如果我在 uiopen 中设置一个断点,那么在拖放 .tga 文件时它永远不会被触发(对我而言)。 - John

3

参考Tommaso的答案,我在我的MATLAB路径下创建了以下M文件:

function out = openics(filename)
img = readim(filename);
if nargout==1
   out = img;
else
   [~,varname] = fileparts(filename);
   disp(['assigning into base: ',varname])
   assignin('base',varname,img);
end

将ICS文件拖放到MATLAB命令窗口上,会在命令行中显示以下内容:
>> uiopen('/Users/cris/newdip/examples/cermet.ics',1)
assigning into base: cermet

检查:

>> whos cermet
  Name          Size             Bytes  Class        Attributes
  cermet      256x256            65714  dip_image              

阅读uiopen的代码(只需键入edit uiopen)可知,它会使用文件名调用open函数,然后使用文件名而不是输出参数调用openics函数。

您也可以键入

img = open('/Users/cris/newdip/examples/cermet.ics');

调用openics函数并将图像加载到变量img中。

注意1:我使用ICS格式,因为没有TGA图像可供测试。ICS是一种显微镜图像文件格式。

注意2:readimDIPimage中的一个函数。

注意3:这很酷,我以前从未尝试在MATLAB中拖放文件。 :)


你使用的matlab版本是多少?(我使用的是2017b)。 opencis在你的路径中的位置在哪里?非常好奇为什么我不能让它工作。 - John
当我在uiopen的开头设置断点时,当我将.tga文件拖入我的工作区时,它不会被触发。 (同样,使用2017b甚至2016b) - John
@John:我的错,我应该说“命令窗口”,而不是“工作区”。我的MATLAB只有一个命令窗口,因为其他部分对我来说没有意义。 :) 我使用的是R2017a,但我认为这种行为已经很多年没有改变了。 - Cris Luengo
当拖动到“工作区”时,显示所有当前变量的区域,对我来说也没有执行uiopen,它会打开一些类似于Excel的ICS文件工具。当拖动到编辑器中时,所有内容都会以文本文件的形式打开,但这是有道理的。我不知道为什么命令窗口和工作区窗口之间会有不同的行为。 - Cris Luengo
路径是您在键入“path”时看到的所有目录。这些大多由工具箱设置,但列表顶部将有一个用户目录。您可以使用“addpath”添加目录到路径中。 - Cris Luengo
显示剩余3条评论

1
其他回答已经解决了“拖放”问题。他们没有解决如何将专有图像格式集成到imread中的问题。这可以通过imformats命令相对简单地完成。
不幸的是,我为什么要花3.5年才能弄清楚这个问题的原因/方法将无法回答...这个功能已经存在15多年了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接