/ / Dostosuj rozmiar i położenie ramek ograniczających, jednocześnie utrzymując je w centrum - python, obraz, opencv, przetwarzanie obrazu

Dostosuj rozmiar i położenie obwiedni, zachowując nieco jej wyśrodkowanie - python, image, opencv, przetwarzanie obrazu

Mam kilka obrazów z odpowiednim ograniczeniemwspółrzędne pola (x, y, w, h). Niektóre obwiednie są prostokątne, więc najpierw chcę, aby były kwadratowe, podczas gdy nadal są wycentrowane na interesującym obszarze. Korzystając z następującego przykładu jabłka, z ramką ograniczającą na łodydze, chciałbym rozszerzyć pudełko na kwadrat, nadal utrzymując go na środku łodygi.

plac

Po drugie, po wyodrębnieniu zawartości ramki granicznej chcę uchwycić informacje kontekstowe, zwiększając rozmiar ramki ograniczającej o n piksele i wyodrębnianie, a następnie powtórz. Następnie chcę przesunąć geometryczny środek obszaru zainteresowania tylko o kilka pikseli i powtórzyć wyodrębnianie wielu obwiedni. Podobnie jak na poniższym obrazku, gdzie różnokolorowe pola reprezentują różne pola, które chcę wyodrębnić. Prawy obraz pokazuje małe przesunięcie w środku, które chcę osiągnąć.

wielokrotność

Mam pomysł, jak to zrobić w numpy, ale czy są jakieś funkcje / biblioteki wyższego poziomu, które pomogłyby mi w zdefiniowaniu obwiedni i manipulowaniu nią jako takimi?

Odpowiedzi:

0 dla odpowiedzi № 1

Używam tego obrazu, aby uzyskać te same efekty:

wprowadź opis obrazu tutaj


Kod i komentarz (jako opis):

#!/usr/bin/python3
# 2017.11.25 17:10:34 CST
# 2017.12.01 11:23:02 CST

import cv2
import numpy as np

## Read and copy
img = cv2.imread("cat.jpg")
canvas = img.copy()

## set and crop the ROI
x,y,w,h = bbox = (180, 100, 50, 100)
cv2.rectangle(canvas, (x,y), (x+w,y+h), (0,0,255), 2)
croped = img[y:y+h, x:x+w]
cv2.imshow("croped", croped)

## get the center and the radius
cx = x+w//2
cy = y+h//2
cr  = max(w,h)//2

## set offset, repeat enlarger ROI
dr = 10
for i in range(0,4):
r = cr+i*dr
cv2.rectangle(canvas, (cx-r, cy-r), (cx+r, cy+r), (0,255,0), 1)
croped = img[cy-r:cy+r, cx-r:cx+r]
cv2.imshow("croped{}".format(i), croped)

## display
cv2.imshow("source", canvas)
cv2.waitKey()
cv2.destroyAllWindows()

Wynik:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj