У меня есть историческая временная последовательность изображений морского дна, отсканированных из фильма, требующих регистрации.
from pylab import *
import cv2
import urllib
urllib.urlretrieve('http://geoport.whoi.edu/images/frame014.png','frame014.png');
urllib.urlretrieve('http://geoport.whoi.edu/images/frame015.png','frame015.png');
gray1=cv2.imread('frame014.png',0)
gray2=cv2.imread('frame015.png',0)
figure(figsize=(14,6))
subplot(121);imshow(gray1,cmap=cm.gray);
subplot(122);imshow(gray2,cmap=cm.gray);
Я хочу использовать черную область слева от каждого изображения, чтобы сделать регистрацию, так как эта область была внутри камеры и должна быть исправлена вовремя. Поэтому мне просто нужно вычислить аффинное преобразование между черными областями.
Я определил эти области по пороговым значениям и нахожу самый большой контур:
def find_biggest_contour(gray,threshold=40):
# threshold a grayscale image
ret,thresh = cv2.threshold(gray,threshold,255,1)
# find the contours
contours,h = cv2.findContours(thresh,mode=cv2.RETR_LIST,method=cv2.CHAIN_APPROX_NONE)
# measure the perimeter
perim = [cv2.arcLength(cnt,True) for cnt in contours]
# find contour with largest perimeter
i=perim.index(max(perim))
return contours[i]
c1=find_biggest_contour(gray1)
c2=find_biggest_contour(gray2)
x1=c1[:,0,0];y1=c1[:,0,1]
x2=c2[:,0,0];y2=c2[:,0,1]
figure(figsize=(8,8))
imshow(gray1,cmap=cm.gray, alpha=0.5);plot(x1,y1,'b-')
imshow(gray2,cmap=cm.gray, alpha=0.5);plot(x2,y2,'g-')
axis([0,1500,1000,0]);
Синий - самый длинный контур из 1-го кадра, зеленый - самый длинный контур из 2-го кадра.
Каков наилучший способ определения вращения и смещения между синими и зелеными контурами?
Я хочу использовать только правую часть контуров в некоторой области вокруг шага, что-то вроде области между стрелками.
Конечно, если есть лучший способ зарегистрировать эти изображения, я бы хотел это услышать. Я уже пробовал стандартный подход к сопоставлению функций на необработанных изображениях, и он не работал достаточно хорошо.