Зацикливание изображений, сохранение идентификатора и его сохранение в датафрейме - PullRequest
0 голосов
/ 24 сентября 2018

Hellos,

Введение:

Я пытаюсь настроить фрейм данных panda, чтобы связать несколько дискретных химических величин с количеством изображений.Это немного выше моего текущего уровня, поэтому я надеялся на некоторую помощь здесь.

Что я получил до сих пор:

В настоящее время я вырезал два столбцаиз предоставленной таблицы данных, которая выглядит следующим образом.DF1

Теперь у меня есть 1688 точек данных, и у меня есть 1225 изображений размером 10x10x4 (RGBA), которые должны быть связаны с ним.(1225,10,10,4) Uint8

Все эти изображения имеют одинаковое имя Sample_ID, указанное в столбце 1. Моя цель - запустить цикл, который выхватывает изображения из папки, выравнивает и изменяет формуих в 300x1, а затем сохраняет их в 3-м столбце, который проверяется по Sample_ID.Это означает, что правильное изображение должно соответствовать правильному Sample_ID.

Я проверил сеть и здесь на stackoverflow.Я уже попробовал 4 различные функции зацикливания изображения, которые не дали мне ожидаемого результата.

Моя лучшая ставка до сих пор, похоже, заключалась в том, чтобы использовать glob, чтобы бросить все это в простой файл.Но мне, безусловно, нужна циклическая функция, которая связывает изображение с соответствующими значениями id и Ni.

Любые предложения о том, как загрузить изображение и сохранить его значение ID для перекрестной ссылки на него с существующим фреймом данных.

Спасибо, что уделили время.

1 Ответ

0 голосов
/ 24 сентября 2018

Предполагая, что идентификатор изображения указан в его имени и используется matplotlib.image.imread

path = '.' # current directory
filenames = [os.path.abspath(os.path.join(path, x)) for x in os.listdir(path) if '.png' in x or '.jpg' in x]

>>> filenames
['image_0.png',
 'image_1.png',
 'image_2.png',
 'image_3.png',
 'image_4.png',
 'image_5.png',
 'image_6.png',
 'image_7.png',
 'image_8.png',
 'image_9.png']

Считывание изображений в информационный кадр и добавление их имен в виде столбца:

from matplotlib.image import imread
images_df = pd.DataFrame([[imread(filename).flatten()] for filename in filenames], columns=['images'])
images_df['id'] = filenames
images_df['id'] = images_df['id'].apply(os.path.basename)
>>> images_df

                                              images           id
0  [0.4627451, 0.05490196, 0.8745098, 0.79607844,...  image_0.png
1  [0.20784314, 0.93333334, 0.73333335, 0.6156863...  image_1.png
2  [0.4117647, 0.3254902, 0.8784314, 0.16470589, ...  image_2.png
3  [0.8627451, 0.6862745, 0.78431374, 0.6431373, ...  image_3.png
4  [0.44705883, 0.627451, 0.57254905, 0.78431374,...  image_4.png
5  [0.7490196, 0.007843138, 0.25490198, 0.1372549...  image_5.png
6  [0.039215688, 0.14901961, 0.5882353, 0.5137255...  image_6.png
7  [0.24705882, 0.94509804, 0.1882353, 0.38039216...  image_7.png
8  [0.35686275, 0.047058824, 0.56078434, 0.062745...  image_8.png
9  [0.8, 0.23921569, 0.99607843, 0.89411765, 0.23...  image_9.png

Извлечение идентификатора из изображений:

>>> images_df['id'] = images_df['id'].str.split('.').str[0]
0    image_0
1    image_1
2    image_2
3    image_3
4    image_4
5    image_5
6    image_6
7    image_7
8    image_8
9    image_9
Name: id, dtype: object

images_df['id'] необходимо преобразовать в целое число, если Sample_ID равно единице.

Присоединить кадры данных:

pd.merge(images_df, new_data_rdy, left_on='id', right_on='Sample_ID')
...