Экспорт интенсивности изображения из нескольких файлов в несколько папок, чтобы преуспеть в Python - PullRequest
0 голосов
/ 12 мая 2018

Мне нужно экспортировать списки интенсивности пикселей, полученные из нескольких изображений в нескольких папках, в электронную таблицу Excel. Каждая папка содержит список файлов TIFF, каждый из которых представляет определенный момент времени в интервале времени. Мне удалось получить интенсивность пикселей каждого подмножества папок, но я борюсь с выходом, чтобы преуспеть, используя DataFrames с пандами. Во фрейме данных отображается только список значений из последней папки, и мне нужна электронная таблица для отображения каждого списка в отдельной строке. Вот что у меня есть:

import os
import matplotlib.pyplot as plt
import skimage.external.tifffile as tiff
import pandas as pd
from pandas import DataFrame

#to read images in each folder
def load_images_from_folder(folder):
images=[]
for filename in os.listdir(folder):
    if any([filename.endswith(x) for x in ['.tif']]):
        img=tiff.imread(os.path.join(folder, filename))
        if img is not None:
            images.append(img)
return images

folders = [
    'path to folder1',
    'path to folder2',
    'path to folder3',
]

for folder in folders:
    images=load_images_from_folder(folder)

#ratio the mean green to red signal in each image 
    ratios = [image[..., 1].mean() / image[..., 0].mean() for image in 
    images]
    plt.plot(range(len(images)), ratios)
    plt.show()


df=DataFrame({'Ratios':ratios})
df.to_excel('Ratios.xlsx', sheet_name='sheet1', index=0)

Распечатка коэффициентов дает: Folder1: [список значений] Folder2: [список значений] folder3: [список значений и т.п. Но данные, отображаемые df (DataFrame), только из списка в папке 3. Итак, что мне нужно сделать по-другому, чтобы экспортировать значения, полученные из нескольких папок, в Excel? Я также удостоверился, что каждое изображение читается как ndarray и type = uint8.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
import tkinter
from tkinter import filedialog
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import askdirectory
import os
import matplotlib.pyplot as plt
import skimage.external.tifffile as tiff
import pandas as pd
from pandas import DataFrame
import numpy as np

def load_images_from_folder(folder):
    images=[]
    for filename in os.listdir(folder):
        if any([filename.endswith(x) for x in ['.tif']]):
            img=tiff.imread(os.path.join(folder, filename))
            if img is not None:
                images.append(img)
    return images

tkinter.Tk().withdraw()   
dirname = askdirectory(initialdir="/", title='Please select a directory')
os.chdir(dirname)

data = pd.DataFrame([])
ratiodata = []
foldernames = []
for folder in os.listdir(dirname):  
    if not folder.endswith('.xlsx'):
       images=load_images_from_folder(folder)
       green=[image[..., 1].mean() for image in images]
       red=[image[..., 0].mean() for image in images]
       ratios= [img[..., 1].mean() / img[..., 0].mean() for img in images]
       #PLOTS
       temp = pd.DataFrame({folder + " ratios" : ratios})
       data = pd.concat([data,temp],axis=1)
data.to_excel('test.xlsx', sheet_name='sheet1')
0 голосов
/ 13 мая 2018

Замена предложения присваивания внутри цикла for вызовом метода списка extend должна решить проблему:

images = []
for folder in folders:
    images.extend(load_images_from_folder(folder))
...