2016-09-26[n年前へ]
■2001年と2011年、テレビ画面の向こうに観た景色。
アニメ映画「君の名は。」を観た。本当のところ、実際のところは、何も知らないけれど、2011年の日本で強く感じたことを原動力にして作り上げられた、綺麗なジュブナイルに思えた。その「君の名は。」をひいて2011年米国映画「Source Code」を紹介しているコメントをFacebookで読んだ。
「君の名は。」も「Source Code」も…そのどちらも、名前も知らない少なからずの人たちが”あるできごと”に巻き込まれ、それを第三者として眺めた人が”あの時何ができたか・その時何ができるか”を考えたことから始まる物語だと思う。そして、多くの物語がそうであるように、そのストーリーを精一杯辿っていくことを経て、(名前も知らない)他の人たちの物語”がそれぞれ浮かび上がってきて、そして何より自分自身(の物語)を発見していくという…いわゆるひとつの物語の王道だと思う。
2001年の秋、日本では早朝の時間に北米から放映されるTV画面の中で理解しがたく観ていたことや、2011年の春の午後に、日本の東北地方で撮影されるTV画面の向こうから、信じがたくリアルタイムで観た映像や、それをきっかけに人生を大きく変えていった親しかった人たちのことを思い起こすと、少しだけ・ほんの時々だけど、”あの時何ができたか・その時何ができるか”とか考えてしまう。
2016-12-12[n年前へ]
■「君の名は。」画風変換アプリをPython/OpenCVで書いてみよう! 〜意外に空変換は簡単? 編〜
先月下旬頃、映画「君の名は。」画風変換アプリEverfilterが流行っていた。軽く遊んでみた印象は、「空領域抽出処理に破綻が少なく(適切で)、その処理はおそらく普通の枯れた方法を使って、画面の4端辺から領域判定を独立にかけてる」ように感じられた。
そこで、普通にやりそうなコードを書いてみたら、空領域抽出がどのくらいの品質が得られるか、確かめてみることにした。手っ取り早く試してみたいというわけで、Python/OpenCVコードを書いてみた。このコードは、入力画像と(入れ替え用の)空画像を読み込んで、グラフカットアルゴリズムが実装されたOpenCVのGrabCut関数を使い、(空がある程度の面積を占めていそうな)画面上半分の領域を対象として空領域を抽出し、その領域に空を合成するという処理を行うものだ。その処理例が、たとえば下に貼り付けた「バンコクの昼風景を夜空の下の街に入れ替えた画像」のようになる(上が入力画像、下が出力画像)。
コードを書いて・試してみた印象は、OpenCVのGrabCut関数を使う程度でも、十分破綻の少ない空領域抽出を行うことができそうで、枯れた(枯れつつある)技術は便利だ!というものだ。実際のところ、「君の名は。」画風変換アプリ程度であれば、使用データ群(入れ替え用画像群)抽出処理も含めて、数日掛からず作ってしまいそうな気がする。
import cv2 import numpy as np img = cv2.imread("bangkok1s.jpg") mask = np.zeros(img.shape[:2],np.uint8) skyimg = cv2.resize(cv2.imread("Starsinthesky.jpg"), img.shape[1::-1]) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) rect = (0,0,img.shape[1],round(img.shape[0]*0.7)) cv2.grabCut(img,mask,rect,bgdModel,fgdModel, 50,cv2.GC_INIT_WITH_RECT) mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') mask2 = cv2.blur(mask2,(5,5)) img2 = img*(1-mask2[:,:,np.newaxis]) skyimg = skyimg*mask2[:,:,np.newaxis] img3 = cv2.addWeighted(skyimg, 1, img2, 1, 2.5) cv2.imwrite("out.jpg",img3) cv2.imshow("preview",img3) cv2.waitKey()