Как обрезать квадратную форму вокруг контуров OpenCV, а не прямоугольника? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть набор изображений повреждений кожи, и я использую OpenCV в python для обнаружения повреждения и обрезки вокруг него, таким образом уменьшая размер (изображения имеют много областей кожи, которые можно обрезать).

Однако я не могу понять, как получить резанное изображение квадратной формы.Любая помощь будет оценена.

Пока что я немного отредактировал код из этого вопроса: Как обрезать самый большой объект в изображении с помощью python opencv?

Вот пример изображения ... Iпытался получить самое нормальное поражение SFW, которое я мог найти, извините, если оно кого-нибудь вырубит: https://i.imgur.com/LBDl1Uf.jpg

И вот код.Я добавил к x, y, w, h (т.е. x + 20 и т. Д.), Чтобы посмотреть, смогу ли я получить его в квадратную форму, но я не думаю, что это способ сделать это.


import cv2
import numpy as np

# load image
img = cv2.imread("ISIC_0024313.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to grayscale
# threshold to get just the signature (INVERTED)
retval, thresh_gray = cv2.threshold(gray, thresh=160, maxval=255, \
                                   type=cv2.THRESH_BINARY_INV)

image, contours, hierarchy = cv2.findContours(thresh_gray,cv2.RETR_LIST, \
                                   cv2.CHAIN_APPROX_SIMPLE)

# Find object with the biggest bounding box
mx = (0,0,0,0)      # biggest bounding box so far
mx_area = 0
for cont in contours:
    x,y,w,h = cv2.boundingRect(cont)
    x, y, w, h = x-40, y-40, w+80,h+80 # make the bounding box a bit bigger
    area = w*h
    if area > mx_area:
        mx = x,y,w,h
        mx_area = area
x,y,w,h = mx

# Output to files
roi=img[y:y+h,x:x+w]

cv2.imshow("im",roi)
cv2.waitKey(0)

cv2.imwrite("cropped.png", roi)

А вот и вывод.Близко, но недостаточно близко: https://i.imgur.com/zSkS4LH.png

Как именно я могу убедиться, что полученная культура квадратная?Также, давая достаточно места для дыхания, чтобы охватить все поражение.

Спасибо

1 Ответ

0 голосов
/ 27 марта 2019

Можете ли вы просто проверить, что больше между h и w и установить оба значения равными, прежде чем выбрать подмассив?Что-то вроде:

if h > w:
    w = h
else:
    h = w

# Then select the sub-array:
roi=img[y:y+h,x:x+w]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...