質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

近似多項式の係数推定

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,059

score 7

前提・実現したいこと

図のような位置校正用の格子板の交点を既知点として抽出し、
そして補正式を3次の近似多項式として係数を最小二乗法を用いて求め、補正式の逆変換を利用して画像の歪曲収差を補正したいです。

イメージ説明

該当のソースコード

"""coding: utf-8"""

from PIL import Image
import numpy as np
import cv2
from matplotlib import pyplot as plt
from scipy import optimize

"""
位置校正用の格子板の交点を既知点として抽出
そして補正式を3次の近似多項式として係数を最小二乗法を用いて求め、濃度値は3次畳み込み内挿法で内挿
"""

img = cv2.imread('図1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

"""Harris corners"""
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)

"""中心見つける"""
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)

"""コーナーをサブピクセル精度で検出、また基準を設ける"""
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)


dst = cv2.dilate(dst,None)

"""描画"""
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,3],res[:,2]] = [0,255,0]


"""格子点の座標を抽出"""
newcorners = np.delete(corners, 0, 0)
print(newcorners) 
a = int(len(newcorners))
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()



"""サブピクセル精度で検出した座標を与えて、多項式の係数を最小二乗法で求める。"""
x = newcorners[:,0]
y = newcorners[:,1]
f = 1 + x + y + x**2 + y**2 + x*y + x**3 + y**3 + y*x**2 + x*y**2

Xtil = np.c_[np.ones(newcorners.shape[0]), newcorners] # Xの行列の左端に[1,1,1,...,1]^Tを加える。
A = np.dot(Xtil.T, Xtil) # 標準形A,bに当てはめる。
b = np.dot(Xtil.T, f)
w = linalg.solve(A, b) # wについて解く。

xmesh, ymesh = np.meshgrid(np.linspace(0, 1000, 20),
                            np.linspace(0,1000, 20))
zmesh = (w[0] + w[1] * xmesh.ravel() +
        w[2] * ymesh.ravel() ).reshape(xmesh.shape)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, f, color='k')
ax.plot_wireframe(xmesh, ymesh, zmesh, color='r')
plt.show()

試したこと

標準形を係数について解くことで10個の係数を求めようと思いましたが、内積を計算するところで3×3、1×3の行列になり係数をうまく求めることができませんでした。

質問したいこと

イメージ説明
補正式がこのように与えられています。
上記プログラムを書き換えることで係数を推定することは可能でしょうか。
また、その場合どのように行列の計算を行えばよいのでしょうか。
ご教授お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る