如何使用边界框坐标裁剪图像中的感兴趣区域?

问题描述

我有几个灰度图像,每个图像都有多个感兴趣的区域,以矩形边界框的形式存在。这些图像的多个边界框坐标存储在一个 CSV 文件中。我希望将这些边界框与它们各自的图像相乘,这样我就只剩下感兴趣的区域了。代码如下:

import numpy as np
from skimage.measure import label,regionprops
from skimage import io
from scipy.ndimage.morphology import binary_fill_holes
import os
import glob
import pandas as pd
import cv2

#get mask coordinates
def get_mask(img_name,df,h,w):
    im_csv_np = df.loc[:,"patientId"].values
    idx = np.where(im_csv_np == img_name)
    if idx[0].shape[0]: 
        mask = np.zeros((len(idx[0]),w))
        for k,j in enumerate(idx[0]):
            i = j.item()
            mask[k,int(df.loc[i]['y_dis']):int(df.loc[i]['y_dis'])+int(df.loc[i]['height_dis']),int(df.loc[i]['x_dis']):int(df.loc[i]['x_dis'])+int(df.loc[i]['width_dis'])] = 1.0
    else:
        mask = np.zeros((1,w))
    return mask

#read data
filenames = glob.glob("data/*.png")
filenames.sort()
df1 = pd.read_csv('bBox.csv')

for f in filenames:
    img = cv2.imread(f,cv2.IMREAD_GRAYSCALE)
    h,w = img.shape
    img_name = f.split(os.sep)[-1]
    print(img_name)
    mask1 = get_mask(img_name,df1,w)
    for i in range(len(mask1)):
        props = regionprops(mask1[i].astype(np.int8))[0]
        df_csv = {"patientId": img_name,"x_dis": props.bBox[1],"y_dis": props.bBox[0],"width_dis": abs(props.bBox[3]-props.bBox[1]),"height_dis": abs(props.bBox[2]-props.bBox[0])}
        contours,_ = cv2.findContours(mask1[i].astype(np.uint8),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
        for contour in contours:
            cropped_image = 
            ......
            ......
    
    io.imsave(os.path.join("bBox",f.split(os.sep)[-1][:-4]+'.png'),cropped_image) 

我需要有关乘以图像和边界框以及保存 ROI 图像的帮助。

解决方法

您不需要找到轮廓。您已经有了 bbox 信息。 试试这个:

for f in filenames:
    img = cv2.imread(f,cv2.IMREAD_GRAYSCALE)
    h,w = img.shape
    img_name = f.split(os.sep)[-1]
    print(img_name)
    mask1 = get_mask(img_name,df1,h,w)
    for i in range(len(mask1)):
        props = regionprops(mask1[i].astype(np.int8))[0]
        
        cropped_image = img[props.bbox[0]:props.bbox[2],props.bbox[1]:props.bbox[3]]
    
        io.imsave(os.path.join("bbox",f.split(os.sep)[-1][:-4]+'_'+str(i)+'.png'),cropped_image)