我尝试加载多个图片,并希望自动化变量命名以生成variable name = the file input name
。
例如:
image1=read_binary('image1.img',DATA_START=0,DATA_TYPE=1,DATA_DIMS=[450, 750,3], ENDIAN=native)
只是想知道这是否可能以及如何?
答案 0 :(得分:1)
您可以将所有图像名称放在字符串数组中并循环显示。如果您的图片是.png,那么我建议您使用read_png function。这可能不是最有效的,但如果图像都具有相同的大小,那么很容易将它们全部堆叠在一个立方体中,如:
;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
现在,您拥有立方体中的所有图像,其中最后一个维度是图像编号。
答案 1 :(得分:1)
我非常喜欢使用像上面概述的veda905这样的3D(或4D)阵列。
但是,如果您真的想为每个图像创建一个新的自变量,您可以创建自己的命令作为字符串并通过execute command执行。
假设您在上面的数组中有文件名:
;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
答案 2 :(得分: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']
答案 3 :(得分:1)
其他人可能会遇到问题,具体取决于您的情况(例如,如果您有大量文件或需要在虚拟机中运行此文件),但肯定有效。
在哈希之前,我就是这样做的:
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])
如果订单很重要,您可以使用ordered hash