登録が必要なフィルムからスキャンされた海底画像の歴史的な時系列があります。
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 フレームからの最長の等高線です。
青と緑の等高線の間の回転とオフセットを決定する最良の方法は何ですか?
矢印の間の領域のような、ステップを囲む領域で輪郭の右側のみを使用したい。
もちろん、これらの画像を登録するためのより良い方法があれば、ぜひ聞きたいです。未加工の画像に対して標準的な機能マッチング アプローチを既に試しましたが、十分に機能しませんでした。