12

pythonを使用して、画像に対して幾何学的変換を実行し、特定の曲線に沿って画像を「まっすぐにする」または修正したいと思います。scikit-imageはこれに非常に適しているようですが、ドキュメントはまばらですProjectiveTransform()warp()ドキュメントhereに従いましたが、サンプル ケースでは正しく動作しませんでした。

例を次に示します。2 つの同心円を含む画像を作成します。目標は、これらの円の 4 分の 1 を修正して、結果の画像が 2 本の平行線になるようにすることです。サンプルデータは次のとおりです。

import numpy as np
a = np.zeros((500, 500))

# create two concentric circles with a thickness of a few pixels:
for i in range(500):
    for j in range(500):
        r = np.sqrt((i - 250)**2 + (j - 250)**2) 
        if r > 50 and r < 52:
            a[i, j] = 10
        if r > 100 and r < 102:
            a[i, j] = 10
# now create the coordinates of the control points in the original image:
(x0, y0) = (250, 250)
r = 30   # inner circle
x = np.linspace(250 - r, 250, 50)
y = np.sqrt(r ** 2 - (x - x0) ** 2) + x0
r2 = 120   # outer circle
x2 = np.linspace(250 - r2, 250, 50)
y2 = np.sqrt(r2 ** 2 - (x2 - x0) ** 2) + x0
dst = np.concatenate((np.array([x, y]).T, np.array([x2, y2]).T))

そして、これをプロットできます。たとえば、次のようになります。

imshow(a, cmap='gist_gray_r')
plot(x, y, 'r.')
plot(x2, y2, 'r.')

ここに画像の説明を入力

したがって、私の目標は、赤いコントロール ポイントで指定された象限の画像を修正することです。(この場合、これは直交座標から極座標への変換と同じです。) ドキュメントの例の scikit イメージを使用して、次のことを行いました。

# create corresponding coordinates for control points in final image:
xi = np.linspace(0, 100, 50)
yi = np.zeros(50)
xi2 = xi
yi2 = yi + (r2 - r)
src = np.concatenate((np.array([xi, yi]).T, np.array([xi2, yi2]).T))

# transform image
from skimage import transform, data
tform3 = transform.ProjectiveTransform()
tform3.estimate(src, dst)
warped = transform.warp(a, tform3)

このwarped画像には 2 本の平行線が表示されると思っていましたが、代わりに次のようになります。 ここに画像の説明を入力

ここで何が間違っていますか?

この場合はデカルトから極への変換ですが、最も一般的なケースでは、任意の曲線からの変換を探していることに注意してください。誰かが他のパッケージを使用したより良い方法を知っている場合は、お知らせください。ndimage.map_coordinates一連の放射状の線を使用することでこの問題を解決できますが、もっとエレガントなものを探していました。

4

1 に答える 1