#python #opencv #image-processing #mask #bounding-box
#python #opencv #обработка изображений #маска #ограничивающая рамка
Вопрос:
У меня есть несколько изображений в оттенках серого, каждое изображение имеет несколько интересующих областей в виде прямоугольных ограничивающих рамок. Эти множественные координаты ограничивающей рамки для изображений хранятся в файле 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.
Комментарии:
1. Я немного не уверен в
multiplying the images and bounding boxes and saving the ROI images
? У вас есть координаты ограничивающей рамки в(x, y, w, h)
формате? Или они у вас есть в виде матрицы 2D-маски. Не могли бы вы добавить небольшую демонстрацию, если это возможно?2. @ZdaR: все координаты ограничивающей рамки доступны в формате (x, y, w, h). Для любого данного изображения может быть несколько ограничивающих рамок.
3. Хорошо, итак, представьте изображение с 2 ограничивающими рамками, одна в левом верхнем углу, а другая в правом нижнем углу, так что в этом случае, как бы вы определили ожидаемый результат?
4. @ZdaR: давайте предположим, что верхний левый прямоугольник охватывает (10,10, 20, 30), а нижний правый охватывает (200,200,10,10).). Результирующее изображение должно содержать значения пикселей исходного изображения только в этих областях. В принципе, эти маски ограничивающей рамки могут быть заполнены «белыми» пикселями, и поэтому при умножении останутся только эти области, а остальные будут затемнены.
5. Понял. Итак, где именно вы столкнулись с проблемой? разбор или умножение изображений в csv?
Ответ №1:
Вам не нужно находить контуры. У вас уже есть информация о 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)
Комментарии:
1. Код работает. Но он обрезает только одну ограничивающую рамку на изображение. На самом деле, в данном изображении есть несколько ограничивающих рамок. Так, например, для изображения с именем «image1.png», имеющего, скажем, три ограничивающих прямоугольника, я должен сохранить эти обрезанные ограничивающие прямоугольники как «image1_bb1.png», image1_bb2.png» и «imgae1_bb3.png».
2. Вероятно, это перезапись сохраненного изображения. Вставьте индекс ‘i’ в свой imsave. Посмотрите на изменения