Нужна помощь в создании комплекса l oop вокруг существующего скрипта - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть скрипт, используемый для рисования прямоугольников над несколькими объектами в изображении на основе предварительно извлеченных координат пикселей x / y / r указанных объектов. Этот сценарий выглядит следующим образом:

import os
import numpy as np
import pandas as pd
import PIL
from PIL import Image
from PIL import ImageDraw
import glob
import re                       # import RegEx module

xeno_data = 'C:\file_path\data.xlsx'
ss = pd.read_excel(xeno_data)

Эти три значения координат пикселя (x / y / r) содержатся в одном и том же столбце электронной таблицы Excel, поэтому для их разделения на отдельные числа выполните следующий шаг:

    # Extract filenames and coordinates from Excel spreadsheet (data.xlsx):
FandC = []
for index, row in ss.iterrows():
   filename = row['filename']
   coords   = row['xyr_coords']
       # Use RegEx to find anything that looks like a group of digits, possibly seperated by decimal point:
   x, y, r = re.findall(r'[0-9.]+',coords)
   print(f'DEBUG: filename={filename}, x={x}, y={y}, r={r}')
   FandC.append({'filename': filename, 'x':x, 'y':y, 'r':r})

Создание новых фреймов данных для интересующих значений - 'filename', 'x', 'y' и 'r':

fandc=pd.DataFrame(FandC)
    #creates a dataframe for "filename", "x", "y", and "r".

fandc['filename'] [fandc['filename']=='Image1.jpg']
    # shows "fandc['filename']" where the "filename" is equal to (==) the string "Image1.jpg".

fandc_f = fandc[fandc['filename']=='Image1.jpg']
    # create new df called "fandc_f" that only includes "fandc['filename']" where "filename" == "Image1.jpg".

for index , row in fandc_f.iterrows():
    row
    break

Нарисуйте прозрачный прямоугольник:

im = im.convert('RGBA')
overlay = Image.new('RGBA', im.size)
draw = ImageDraw.Draw(overlay)

for index, row in fandc_f.iterrows():
    for i in range(len(fandc_f)):
        draw.rectangle(((float(row['x'])-float(row['r']), float(row['y'])-float(row['r'])), (float(row['x'])+float(row['r']), float(row['y'])+float(row['r']))), fill=(255,0,0,55))

# Remove alpha for saving in jpg format:        
img = Image.alpha_composite(im, overlay)
img = img.convert("RGB")

Этот код отлично работает ... для одного изображения:

IMAGE_OUTPUT

Однако теперь мне нужно обернуть все обработать с большим l oop снаружи, который автоматически проходит через каждое уникальное имя файла в pandas df. ​​

Для каждого мне нужно: загрузить изображение, отфильтровать df для соответствующих имен файлов , примените мой прямоугольный рисунок l oop, сохраните изображение, а затем l oop автоматически перейдите к следующему изображению (так как у меня есть тысячи изображений для обработки, и я не могу сделать это вручную).

Если есть уточнение нужно спросить прочь! :)

Спасибо, Род

...