0

我正在尝试加载多个图像并希望自动命名变量以使variable name = the file input name.

例如:

image1=read_binary('image1.img',DATA_START=0,DATA_TYPE=1,DATA_DIMS=[450, 750,3], ENDIAN=native)

只是想知道这是否可能以及如何?

4

4 回答 4

1

哈希是为此而构建的:

h = hash()

image1 = read_binary('image1.img', data_start=0, data_type=1, $
                     data_dimes=[450, 750, 3], endian=native)
h['image1.img'] = image1

然后稍后检索:

tv, h['image1.img']
于 2017-11-29T19:41:52.510 回答
1

您可以将所有图像名称放在一个字符串数组中并对其进行循环。如果您的图像是 .png,那么我建议您使用read_png 函数。这可能不是最有效的,但如果图像都具有相同的大小,那么很容易将它们全部堆叠在一个立方体中,例如:

;Make a string array containing the names of the images
names = ['image2.png', 'image2.png', 'image3.png']

;Make a byte array to contain the x and y dimensions, the rgb, for each image
image_stack = bytarr(dimension1,dimension2,3,n_elements(names))

for i=0,n_elements(names)-1 do begin
    img = READ_PNG(names[i],rpal,gpal,bpal)

    image_stack[*,*,0,i] = rpal  ;set r channel of image i
    image_stack[*,*,1,i] = gpal  ;set g channel of image i
    image_stack[*,*,2,i] = bpal  ;set b channel of image i
endfor

现在您在一个立方体中拥有所有图像,其中最后一个维度是图像编号。

于 2017-11-28T15:33:30.930 回答
1

我非常喜欢使用 3D(或 4D)阵列的方式,例如上面概述的 veda905。

但是,如果您真的想为每个图像创建一个新的独立变量,您可以将自己的命令创建为字符串并通过执行命令执行它。

假设您在上面的数组中有文件名:

;Make a string array containing the names of the images
names = ['image2.png', 'image2.png', 'image3.png']
; you need to supply the filename extension
varnames = FILE_BASENAME(names, '.png')

FOR i=0, N_ELEMENTS(varnames)-1 DO BEGIN
    result = EXECUTE(varnames[i] + '= READ_PNG(names[' + STRING(i) + '])')
ENDFOR
于 2017-11-29T16:07:54.760 回答
1

Mike 的@mgalloy 答案是最好的方法。

根据您的情况,其他人可能会遇到问题(例如,如果您有很多文件或需要在虚拟机中运行它),但肯定可以。

在散列之前,这是我以前的做法:

files = ['image1.img', 'image2.img', 'image3.img']
FOR i=0, N_Elements(files)-1 DO BEGIN
  varName = File_BaseName(files[i], '.png')
  thisImg = Read_Binary(files[i])
  (Scope_VarFetch(varName), Level=0, /Enter) = thisImg
ENDFOR

Scope_VarFetch是一个神奇的命令,它创建一个具有特定名称(以字符串形式给出)的变量,并将数据分配给它。您也可以以类似的方式检索变量。

但是,使用 IDL 的一些更现代的功能要容易得多。使用哈希和 ForEach 的相同代码?

files = ['image1.img', 'image2.img', 'image3.img']
imgs = Hash()
FOREACH, f, files Do imgs[f] = Read_Binary(files[i])

如果顺序很重要,您可以使用有序哈希

于 2017-11-30T15:39:44.177 回答