22

この質問は、次の質問に関連しています。How to remove convexity defects in sudoku square

で実装しようとしていnikie's answerましたMathematica to OpenCV-Python。しかし、私は手順の最終段階で立ち往生しています。

つまり、以下のようにすべての交点を正方形で取得しました。

ここに画像の説明を入力

今、私は以下に示すように、これをサイズ (450,450) の完全な正方形に変換したいと思います。

ここに画像の説明を入力

(2 つの画像の明るさの違いは気にしないでください)。

質問: OpenCV-Python でこれを行うにはどうすればよいですか? cv2バージョンを使用しています。

4

2 に答える 2

35

etarion の提案とは別に、リマップ機能を使用することもできます。これを行う方法を示す簡単なスクリプトを作成しました。ご覧のとおり、Python でのコーディングは非常に簡単です。これはテスト画像です:

歪んだ画像

これはワープ後の結果です。

ゆがんだ画像

コードは次のとおりです。

import cv2
from scipy.interpolate import griddata
import numpy as np

grid_x, grid_y = np.mgrid[0:149:150j, 0:149:150j]
destination = np.array([[0,0], [0,49], [0,99], [0,149],
                  [49,0],[49,49],[49,99],[49,149],
                  [99,0],[99,49],[99,99],[99,149],
                  [149,0],[149,49],[149,99],[149,149]])
source = np.array([[22,22], [24,68], [26,116], [25,162],
                  [64,19],[65,64],[65,114],[64,159],
                  [107,16],[108,62],[108,111],[107,157],
                  [151,11],[151,58],[151,107],[151,156]])
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(150,150)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(150,150)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')

orig = cv2.imread("tmp.png")
warped = cv2.remap(orig, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("warped.png", warped)

ググってgriddataの機能を見つけることができると思います。つまり、補間を行います。ここでは、cv2.remap が密なマッピングを必要とするため、疎なマッピングを密なマッピングに変換するために使用します。OpenCV は float64 型について不平を言うので、値を float32 に変換する必要があるだけです。それがどうなるか教えてください。

更新: Scipy に依存したくない場合、1 つの方法は、コードに 2 次元補間関数を実装することです。 .org/en/latest/_modules/engine/interpolation2d.html numpy のみに依存します。ただし、これにはScipyまたは別のライブラリを使用することをお勧めしますが、CV2とnumpyのみを必要とする方がこのような場合に適している理由はわかります。最終的なコードで Sudokus がどのように解決されるかをお聞きしたいと思います。

于 2012-04-29T18:34:39.350 に答える