如何为多幅图像提取固定大小的ROI?

2024-05-23 19:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个图像文件夹。我想将对象提取为固定大小的ROI,例如(100*100),并提取该对象的位置。我使用以下代码。但它只能将轮廓裁剪成各种矩形。我的目标是将对象提取到大小相等的帧中。我需要像下面的例子一样,输出补丁的形状是相等的。 input output samples

        import cv2
        import glob


        def crop_brain_contour(image):
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # grayscale
            cnts = cv2.findContours(gray, cv2.RETR_EXTERNAL,   cv2.CHAIN_APPROX_SIMPLE)
            cnts = cnts[0] if len(cnts) == 2 else cnts[1]

            #ROI_number = 0
            for c in cnts:
               x,y,w,h = cv2.boundingRect(c)
               ROI = image[y:y+h, x:x+w]
               #cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
               #ROI_number += 1
               return ROI

        i=0
        for img in glob.glob('./image_data/*.bmp'):
           cv_img = cv2.imread(img)
           img_crop = crop_brain_contour(cv_img)
           #img_resize = cv2.resize(img_crop,(224,224))
           cv2.imwrite("./extracted_data_1/image%04i.bmp" %i,img_crop)
        i += 1
       

Tags: 对象incropimageimportnumberimgfor
1条回答
网友
1楼 · 发布于 2024-05-23 19:45:18

在调用crop_brain_contour函数的位置进行以下更改:

desired_width, desired_height = (100, 100)
final_img = np.zeros((desired_height, desired_width, 3), dtype="uint8")
img_crop = crop_brain_contour(cv_img)
h,w = img_crop.shape[:2]
#Make sure h < desired_height and w < desired_width
x1 = int(desired_width/2 - w/2)
y1 = int(desired_height/2 - h/2)
x2 = x1 + w
y2 = y1 + h

final_img[y1:y2, x1:x2, :] = img_crop

# Write the final image
cv2.imwrite("./extracted_data_1/image%04i.bmp" %i,final_img)

相关问题 更多 >