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.
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ąć.
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 № 1Używam tego obrazu, aby uzyskać te same efekty:
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: