逆行列を使って元の形に | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

完全に元の形にとはいきませんでしたが

逆行列が有効なことは結果をみれば明らかです

画像の中止の取り方やその他の要素も絡んでくるのでしょう

よくレンズの弧の仰角θRとそれと垂直面の角度θrで

レンズ半径Rとその面に投影した r の式などがありますが

魚眼レンズが完全な半球形であるとした場合

平面上で扱えるのではないかと考えます

優秀な方々の理論を否定する訳ではありません

一人くらいヒネクレモノがいても良いではありませんか

それにしても処理に時間が掛かり過ぎます

勿論、テストは軽い画像を使いました

これらの画像はその2x2倍の画像になります

 

魚眼レンズ風の画像

逆行列で元画像に戻した画像

コード

import matplotlib.pyplot as plt
import numpy as np
import cv2
s = 1
# load image
img = cv2.imread('gyogan.png')
#img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# show image with matplotlib
pix = img.shape[0]
x = np.linspace(-1,1,pix+1) # define square
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.gray()
import sys
plt.figure(figsize=(5, 5))
for i in range(pix):
    sys.stdout.write(str(i))
    sys.stdout.write(" ")
    for j in range(pix):
        p=pix/10
        q=3*p
        L1 = 1 /(p + np.sqrt((i-pix/2)**2 + (j-pix/2)**2)) * q
        L2 = 1 / (p + np.sqrt((i+1-pix/2)**2 + (j-pix/2)**2)) * q
        L3 = 1 / (p + np.sqrt((i+1-pix/2)**2 + (j+1-pix/2)**2)) * q
        L4 = 1 / (p + np.sqrt((i-pix/2)**2 + (j+1-pix/2)**2)) * q
        A = np.array([[L1, 0, 0, 0], [0, L2, 0, 0], [0, 0, L3, 0], [0, 0, 0, L4]])
        B = np.array([x[i],x[i+1],x[i+1],x[i]])
        C = np.array([x[j],x[j],x[j+1],x[j+1]])
        D = np.linalg.inv(A)
        tx_z = np.dot(D, B)
        ty_z = np.dot(D, C)
 
        zt = tx_z + 1j*ty_z
        tx = tx_z/2
        ty = ty_z/2
        clr_b = np.double(img[ pix - j - 1 , i,0])/256
        clr_g = np.double(img[pix - j - 1 , i,1])/256
        clr_r = np.double(img[pix - j - 1 , i,2])/256       
        plt.fill(tx,ty,color=(clr_r,clr_g,clr_b))
plt.gca().set_aspect('equal', adjustable='box')
sc = 1.1
plt.xlim(-s*sc,s*sc)
plt.ylim(-s*sc,s*sc)
plt.savefig("original.png")
plt.show()