Home > Mobile >  Iterate over an image directory, crop the images and save to a new directory
Iterate over an image directory, crop the images and save to a new directory

Time:10-26

I have a an image directory I have loaded into a dataframe with annotations coordinates, I am trying to crop the images according to the coordinates (xmin, xmax, ymin, ymax) and save them into a new dataframe but keep getting an error.

This is the code I have so far:

Here is the df I have

File_Path xmin xmax ymin ymax filename
/MyDrive/Brand_Logos/img1.jpg 100 200 100 200 img1.jpg
/MyDrive/Brand_Logos/img2.jpg 200 300 200 300 img2.jpg
/MyDrive/Brand_Logos/img3.jpg 200 300 200 300 img3.jpg

here is the code I am trying to use to parse all the files and save them to a new directory

import pandas as pd
import os
import cv2

df = pd.read_csv('annotations.csv')

src_path = '/MyDrive/Brand_Logos/'

if not os.path.exists(os.path.join(src_path,'imageProcessDir')):
    os.mkdir(os.path.join(src_path,'imageProcessDir'))

dest_path = src_path 'imageProcessDir'

for index, row in df.iterrows():
 filename = row['filename']
    xmin = row['xmin']
    xmax = row['xmax']
    ymin = row['ymin']
    ymax = row['ymax']
    xmin = int(xmin)
    xmax = int(xmax)
    ymin = int(ymin)
    ymax = int(ymax)
    image = cv2.imread(src_path row['filename'])
    crop = image((xmin, ymin), (xmax, ymax))
    cv2.imwrite(dest_path "/" filename  "_"  'cropped' ".jpg", crop)

I have a feeling that the cv2 or the crop variable are not working properly, what am I missing?

CodePudding user response:

You don't use the correct way to crop the image, you should do like this:

crop = image[xmin:xmax, ymin:ymax]

CodePudding user response:

You are calling the image array with image((xmin, ymin), (xmax, ymax)), instead of slicing image[ymin:ymax, xmin: xmax].

In your case, if I want to read and save the image with 3 channels, I would do the following:

image = cv2.imread(src_path row['filename'])
crop = image[ymin:ymax, xmin:xmax]
  • Related