Darkside(https対応しました)

2022年6月9日(木) 21:46

静止画ステッチ自作ソフト

 倍率色収差の補正は、あちらを修正すればこちらが悪化するという感じで、微調整の泥沼に入りそうになる。正確なレンズデーターが無い中で完璧な補正を追求すると、手に負えなくなりそうだ。ここは、EOS VR Utility より明らかに優れた画像が得られるなら良しとすべきだろう。
 自作補正のパラメーターが理想のパラメーターからズレているのは当たり前なので、ギリギリまで追い込めば別の部分で過剰補正が発生するのがオチ。ぐっと我慢して補正量を手控えねばならない。

 計算値を参考に、少しだけ手動でパラメーターを変更。公式以上なら、妥協しよう。
 こうして、一応の成功を見た。

 左が EOS VR Utility 出力で、右が自作ステッチ出力。倍率色収差が明らかに減少している上で、解像感も損なわれていない。
 Jpeg 圧縮されたものしかステッチできない EOS VR Utility に対し、RAW 現像結果をステッチできる時点で、自作のアドバンテージは明白である。収差の影響がほぼ無い画面中央付近でも、自作の方が画質は上だ。
 以下は、ステッチソフトの後半部分。現在まだ手抜きで、サブルーチンにしていない。

width = 8192
height = 5464
# ステッチ中心
LX = 2114
LY = 2707
RX = 1982
RY = 2721
# 収差補正中心
CLX = 1808
CLY = 2592
CRX = 2113
CRY = 2913
CX = LX - dfish / 2
CY = LY - dfish / 2
for i in range(len(xmapL)):
    xmapL[i] = xmap[i] + CX
for i in range(len(ymapL)):
    ymapL[i] = ymap[i] + CY
CX = RX - dfish / 2
CY = RY - dfish / 2
for i in range(len(xmapR)):
    xmapR[i] = xmap[i] + CX
for i in range(len(ymapR)):
    ymapR[i] = ymap[i] + CY
img = cv2.imread(args.infile)
img_left = img[0:height, int(width/2):width]
img_right = img[0:height, 0:int(width/2)]
# 倍率色収差の補正
MAG_RED = 1.00055
MAG_BLUE = 1.0
WARP_FLAGS = cv2.INTER_LANCZOS4 # Lanczos 補間
im_bgr = cv2.split(img_left) # B=im_bgr[0] R=im_bgr[1] G=im_bgr[2]
M = cv2.getRotationMatrix2D((CLX, CLY), 0, MAG_RED)
img_red = cv2.warpAffine(im_bgr[1], M, (int(width/2), height), flags=WARP_FLAGS)
M = cv2.getRotationMatrix2D((CLX, CLY), 0, MAG_BLUE)
img_blue = cv2.warpAffine(im_bgr[0], M, (int(width/2), height), flags=WARP_FLAGS)
im = cv2.merge((img_blue, img_red, im_bgr[2]))
left = cv2.remap(im, xmapL, ymapL, WARP_FLAGS, cv2.BORDER_CONSTANT)
im_bgr = cv2.split(img_right) # B=im_bgr[0] R=im_bgr[1] G=im_bgr[2]
M = cv2.getRotationMatrix2D((CRX, CRY), 0, MAG_RED)
img_red = cv2.warpAffine(im_bgr[1], M, (int(width/2), height), flags=WARP_FLAGS)
M = cv2.getRotationMatrix2D((CRX, CRY), 0, MAG_BLUE)
img_blue = cv2.warpAffine(im_bgr[0], M, (int(width/2), height), flags=WARP_FLAGS)
im = cv2.merge((img_blue, img_red, im_bgr[2]))
right = cv2.remap(im, xmapR, ymapR, WARP_FLAGS, cv2.BORDER_CONSTANT)
om = cv2.hconcat([left, right])
cv2.imwrite(args.outfile, om)

 こうなれば、次はこの処理を動画ステッチの方に組み込むのは当然だ。

written by higashino [Virtual Reality] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4