簡體   English   中英

如何使用邊界框坐標裁剪圖像中的感興趣區域?

[英]How to crop regions of interest in an image using bounding box coordinates?

我有幾個灰度圖像,每個圖像都有多個感興趣的區域,以矩形邊界框的形式。 這些圖像的多個邊界框坐標存儲在 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]),h,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,h,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, h, 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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM