2018年11月29日木曜日

開発環境

実践 コンピュータビジョン (Jan Erik Solem (著)、相川 愛三 (翻訳)、オライリージャパン)の2章(画像の局所記述子)、2.4(演習問題)1.を取り組んでみる。

コード(Emacs)

Python 3

#!/usr/bin/env python3
from PIL import Image
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
import harris

print('1.')


def plot_matches(im1, im2, locs1, locs2, matchscores,
                 show_below=True, max_distance=1000):
    """ 対応点を線で結んで画像を表示する
      入力: im1,im2(配列形式の画像)、locs1,locs2(特徴点座標)
         machescores(match()の出力)、
         show_below(対応の下に画像を表示するならTrue)"""

    im3 = harris.appendimages(im1, im2)
    if show_below:
        im3 = np.vstack((im3, im3))

    plt.imshow(im3)

    cols1 = im1.shape[1]
    for i, m in enumerate(matchscores):
        distance = np.sqrt((locs1[i][1] - locs2[m][1]) ** 2 +
                           (locs1[i][0] - locs2[m][0]) ** 2)
        if m > 0 and distance <= max_distance:
            plt.plot([locs1[i][1], locs2[m][1]+cols1],
                     [locs1[i][0], locs2[m][0]], 'r')
    plt.axis('off')


if __name__ == '__main__':
    filename1 = 'building1.jpg'
    filename2 = 'building2.jpg'
    image1 = np.array(Image.open(filename1).convert('L'))
    image2 = np.array(Image.open(filename2).convert('L'))
    width = 5
    harris_image = harris.compute_harris_response(image1, 5)
    filtered_cords1 = harris.get_harris_points(harris_image, width + 1)
    d1 = harris.get_descriptors(image1, filtered_cords1, width)
    harris_image = harris.compute_harris_response(image2, 5)
    filtered_cords2 = harris.get_harris_points(harris_image, width + 1)
    d2 = harris.get_descriptors(image1, filtered_cords2, width)

    print('starting matching')
    matches = harris.match_twosided(d1, d2)

    n = 3
    for m in range(0, n):
        distance = 10 ** (n - m)
        plt.figure()
        plt.gray()
        plt.subplots_adjust(0, 0, 1, 1, 0, 0)
        plot_matches(image1, image2, filtered_cords1,
                     filtered_cords2, matches, max_distance=distance)
        plt.savefig(f'sample1_{m}.jpg')
        plt.close()

入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))

$ ./sample1.py
1.
starting matching
$
新宿新都心の高層ビル群 1 新宿新都心の高層ビル群 2 新宿新都心の高層ビル群 比較 最大距離 1000 新宿新都心の高層ビル群 比較 最大距離 100 新宿新都心の高層ビル群 比較 最大距離 10

0 コメント:

コメントを投稿