Vorrei riconoscere i confini di una piastrellatura esagonale in una fotografia, come nell'immagine qui sotto:
Mi sembra che un approccio standard su una griglia quadrata sia innanzitutto quello di rilevare gli angoli (ad esempio astuto) e quindi estrarre le linee più lunghe tramite una trasformazione di Hough o qualcosa di simile.
Questa non sembra una soluzione ottimale con la piastrellatura esagonale, perché la lunghezza delle linee esterne è più corta ed è difficile separarle dalle altre linee.
Esiste un algoritmo per risolvere questo problema? Sarebbe particolarmente bello avere una soluzione in Opencv, ma sono anche interessato a idee generali.
aggiornare:
Con Python e Opencv sono stato in grado di ricevere questo risultato:
Ecco il mio codice:
import cv2
import numpy as np
imgOrig = "test1";
img = cv2.imread(imgOrig+".jpg");
lap = cv2.Laplacian(img, cv2.IPL_DEPTH_32F, ksize = 3)
imgray = cv2.cvtColor(lap,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
size = img.shape
m = np.zeros(size, dtype=np.uint8)
for i, cnt in enumerate(contours):
if cv2.contourArea(cnt) >= 1:
color = (255,255,255)
cv2.drawContours(m, cnt, -1, color, -1)
cv2.imwrite(str(imgOrig)+"contours.jpg", m);
Il laplaciano dell'immagine si presenta come:
Proverò a optare per i parametri di questo approccio e poi proverò a interpolare i confini delle quattro sezioni.