Opencv, как перерезать изображение? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть набор произвольных изображений. Половина изображений - это изображения, половина - маски, определяющие ROIS.

В текущей версии моей программы я использую область интереса для обрезки изображения (т.е. я выделяю прямоугольник на изображении, соответствующий ограничивающей рамке маски области интереса). Проблема в том, что маска ROI не идеальна, и в моем случае лучше прогнозировать больше, чем прогнозировать.

Итак, я хочу скопировать больше, чем прямоугольник ROI, но если я сделаю это, возможно, я попытаюсь обрезать изображение.

т.е.:

 x, y, w, h = cv2.boundingRect(mask_contour)
 img = img[int(y-h*0.05):int(y + h * 1.05), int(x-w*0.05):int(x + w * 1.05)]

может произойти сбой, потому что он пытается получить доступ за пределами пикселей. Я мог бы просто зафиксировать значения, но я хотел знать, есть ли лучший подход

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы можете добавить границу , используя OpenCV

lena with boarder

import cv2 as cv
import random
src = cv.imread('/home/stephen/lenna.png')
borderType = cv.BORDER_REPLICATE
boarderSize = .5
top = int(boarderSize * src.shape[0])  # shape[0] = rows
bottom = top
left = int(boarderSize * src.shape[1])  # shape[1] = cols
right = left    
value = [random.randint(0,255), random.randint(0,255), random.randint(0,255)]
dst = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)
cv.imshow('img', dst)
c = cv.waitKey(0)
0 голосов
/ 17 апреля 2019

Может быть, вы могли бы попытаться ограничить координаты заранее. Пожалуйста, смотрите код ниже:

[ymin, ymax] = [max(0,int(y-h*0.05)), min(h, int(y+h*1.05))]
[xmin, xmax] = [max(0,int(x-w*1.05)), min(w, int(x+w*1.05))]
img = img[ymin:ymax, xmin:xmax]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...