Имя переменной IDL на основе имени входного файла
Я пытаюсь загрузить несколько изображений и хочу автоматизировать именование переменных, чтобы сделать 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 ответа
Хэши созданы для этого:
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']
Я очень предпочитаю способ с 3D (или 4D) массивом, как veda905, описанный выше.
Однако, если вы действительно хотите создать новую независимую переменную для каждого изображения, вы можете создать свою собственную команду в виде строки и выполнить ее с помощью команды execute.
Предполагая, что у вас есть имена файлов в массиве, как указано выше:
;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
Вы можете поместить все имена изображений в строковый массив и выполнить цикл по нему. Если ваши изображения.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
Теперь у вас есть все изображения в кубе, где последним измерением является номер изображения.
Ответ Майка @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])
Если порядок имеет значение, вы можете использовать заказанный хеш