裁剪并存储边界框图像区域以收集图像?

问题描述 投票:0回答:1

当前代码旨在裁剪并存储文件夹中一组图像的多个边界框图像区域。裁剪后的边框图像区域存储到其他文件夹中。总共有100张图像,每个图像都有多个边界框。 CSV文件包含每个给定图像的多个边界框坐标。代码如下所示:

import pandas as pd
import cv2
import numpy as np
import glob
import os

filenames = glob.glob("folder/abnormal/*.png")
filenames.sort()
images = [cv2.imread(img) for img in filenames]
print(images)
df = pd.read_csv('abnormal.csv')

for img in images:
    for i in range(len(df)):
        name = df.loc[i]['patientId']
        start_point = (df.loc[i]['x_dis'],df.loc[i]['y_dis'])  
        end_point = (df.loc[i]['x_dis']+df.loc[i]['width_dis'],df.loc[i]['y_dis']+df.loc[i]['height_dis'])  
        crop = img[df.loc[i]['y_dis']:df.loc[i]['y_dis']+df.loc[i]['height_dis'],
                     df.loc[i]['x_dis']:df.loc[i]['x_dis']+df.loc[i]['width_dis']]
        cv2.imwrite("abnormal/crop_{0}.png".format(i), crop)

在运行上面的代码时,循环将无限期地继续。发生这种情况的原因是,所有作物都针对image1的边界框图像区域,然后转换所有存储的作物相对于image2的边界框图像区域,依此类推。需要的是每个图像的多个框区域并裁剪和存储一次。图像以名称Patient * .png(Patient1.png)或Patient *。*。png(Patient1_1.png)开头。

python opencv crop bounding-box image-preprocessing
1个回答
0
投票

以下代码段应完成此工作:

filenames = glob.glob("folder/abnormal/*.png")
filenames.sort()
df = pd.read_csv('abnormal.csv')
im_csv_np = df.loc[:,"patientId"].values

for f in filenames:
    img = cv2.imread(f)
    img_name = f.split(os.sep)[-1]
    idx = np.where(im_csv_np == img_name)
    if idx[0].shape[0]: # if there is a match shape[0] should 1, if not 0
        for i in idx:
            name = df.loc[i]['patientId']
            start_point = (df.loc[i]['x_dis'],df.loc[i]['y_dis'])  
            end_point = (df.loc[i]['x_dis']+df.loc[i]['width_dis'],df.loc[i]['y_dis']+df.loc[i]['height_dis'])  
            crop = img[df.loc[i]['y_dis']:df.loc[i]['y_dis']+df.loc[i]['height_dis'],
                        df.loc[i]['x_dis']:df.loc[i]['x_dis']+df.loc[i]['width_dis']]
            cv2.imwrite("abnormal/crop_{0}.png".format(i), crop)
© www.soinside.com 2019 - 2024. All rights reserved.