にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Photoshop CS6で動画からアニメーションGIF作成

この記事では、 Photoshop CS6 を使って動画からアニメーションGIFを作成する方法を説明します。
f:id:nixeneko:20170327231806g:plain

こんな感じのものを出力します。


動画ファイルが比較的手軽に扱える時代になりましたが、HTML上などで画像感覚で手軽に動画を扱えるアニメーションGIFはまだまだ便利な技術です。
動画からアニメーションGIFを生成するのは、 Photoshop を使って簡単に行うことができます。ここではCS6を使いました。

手順

動画ファイルを用意

まず動画ファイルを用意します。Photoshopから読み込める形式になっている必要があります。
ここではAfterEffectsでレンダリングした圧縮なしのAVIファイルを用意しました。

動画を開く

ファイル(F) -> 読み込み(M) -> ビデオフレームからレイヤー(F) を選択します。
f:id:nixeneko:20170327224731p:plain

用意したAVIファイルを選択し、開くを選択します。
f:id:nixeneko:20170327224952p:plain

「ビデオをレイヤーに読み込む」ダイアログが開くので、「フレームアニメーションを作成」がチェックされていることを確認して今回はそのままOKを押します。
ここで読み込む範囲を指定することもできます。
f:id:nixeneko:20170327225321p:plain

すると、ビデオのフレームがレイヤーとして読み込まれ、タイムラインにフレームが表示されます。
f:id:nixeneko:20170327225759p:plain

この状態ですでにフレームの表示時間の指定がなされているため、表示時間を変更する必要がなければすぐに出力できます。

アニメーションGIFの作成

ファイル(F) -> Web用に保存... を選択します。
f:id:nixeneko:20170327230040p:plain

出力設定

するとダイアログが開くので、各種設定をします。
f:id:nixeneko:20170327230840p:plain

  • 形式に「GIF」を指定
  • 「カラー」で色数の設定(256が最大)
  • 今回の動画では透明部分を含まないので「透明部分」のチェックを外す
  • 「画像サイズ」で出力画像サイズの設定
  • アニメーションの「ループオプション」で、無限ループにするか、ループをしないかを設定可能

今回はその他はデフォルトのままにしてあります。
プレビューの下部に出力ファイルサイズが表示されるのでそれも参考に設定を変えていきます。
ちなみにTwitterにアップできるGIFのファイルサイズの制限は15MBまでだそうです(2017年3月27日現在)。

最後に「保存...」をクリックし、保存ファイル名を指定して保存します。

sshでログインした先で、ログアウトしてもコマンドの実行が継続されるようにする: screenコマンド

sshでログインしている先のLinuxで、終了まで長い時間がかかるDNNの学習などの処理を実行し、後はログアウトして終了を待つ、ということがしたかったので、どうすればいいのか調べたメモ。


バックグラウンド実行しただけではログアウトすると終了してしまう。
nohupを使用しても、ログアウト時に終了されてしまう。

screenコマンド

どうやらscreenコマンドを使用するといいらしい。
screenは仮想的な端末を作成することができるコマンドで、作成した仮想端末は必要に応じて付け替えて使え、さらにログアウトしても保持されるらしい。
詳しい使い方は以下のサイトを参照。
qiita.com

asayamakk.hatenablog.com

suでユーザを切り替えた場合

ただし、screenコマンドはsuでユーザを切り替えている場合、ターミナルが開けないとエラーを吐く。
ログインしたユーザに対し擬似ターミナルが作成されているため、ユーザを切り替えた先ではターミナルが無く、scriptコマンドを実行して擬似ターミナルを無理やり作成しないといけないとのこと。


あるいは、suによってユーザを切り替えるのではなく、初めからそのユーザでログインすればこの問題は起こらない。

sshで接続した先でmatplotlibなどがエラーを吐く

qiita.com

ssh接続した先でpythonからmatplotlibを扱うと$DISPLAY環境変数がないよって怒られる

_tkinter.TclError: no display name and no $DISPLAY environment variable

なので、

env DISPLAY=:0 python hoge.py

みたいにして実行するといいらしい。

現在時刻のglobal date and time stringを生成する

HTML5では、時間を指定するための<time>要素があり、また<del>要素などではdatetime属性によって時間を指定できる。これは編集履歴を残すのに都合がよい。

ここに指定するのは、有効なglobal date and time stringでなければならない。

例えば、

2017-03-15T20:53:45+09:00

とすると、2017年3月15日の20時53分45秒、タイムゾーン+09:00(=日本時間)ということになる。


ときどき現在時刻がこの形で欲しくなるので、このdatetimeに指定するための文字列を自動生成するようなものを作っておく:

UTC版:
タイムゾーン版:

ScanSnap S1300iで自炊を試す

ScanSnap S1300iを買って手元の書類とかをスキャンしてたのだけれど、本も断裁すればスキャンできるなあというので、NHKラジオ講座のテキストを捨てる前にスキャンしてみることにした。


これをスキャンする。
f:id:nixeneko:20170308230708p:plain


まずカッターマット、カッター、定規を用意し、
f:id:nixeneko:20170308230920p:plain

背から2 mmくらいのところに定規を当てて固定し、カッターで何度もなぞりながら切っていく。
f:id:nixeneko:20170308231055p:plain

背から1 mm程度だと接着している糊だけ落とす感じで、紙は部分的にくっついていて、ばらばらにはならない。2mm切断するとページの大部分がバラバラになるので、2 mm位が適切だろうと思う。


f:id:nixeneko:20170308231545p:plain
糊が残っていて紙同士がくっついている場合があるので、ばらばらになっていることを確認しつつ、くっついているところがあればはがしていく。
特に、表紙の隣のページはしっかりくっついているのではがさないといけない。はがさないでScanSnapに投入した場合、紙送りに失敗する。


f:id:nixeneko:20170308232005p:plain
断裁した本をセットする。S1300iは一度にセットできるのが10枚程度ということになっているが、20枚くらいセットしても大抵はちゃんと紙送りしてくれる。紙の状態が悪いと重送が発生するので気を付けないといけないが。
一度に全部をセットできないので、スキャンが進むにつれて原稿を注ぎ足し注ぎ足ししていくか、あるいは何回かに分けてスキャンしたものをAcrobat Proなどで一枚のPDFに結合する必要がある。


断裁~スキャンにかかる時間は一冊当たり15分ほど。
本格的に自炊するのであれば、2万円ほど上乗せして、スキャン速度も速く一度にセットできる枚数も多い上位機を購入すべきだと思う。カッターで切れるのはこのくらいの厚さが限度だと思うので、厚い本をスキャンするつもりであれば断裁機を買わなければならなさそう。

8mmフィルムの白リーダを買う

現像した8mmフィルムの最初についてる白いリーダ部分が映写機の不調なオートローディングに巻き込まれズタズタになってしまったので、代わりの白リーダを探していた。欲しいのはシングル8用であるが、スーパー8用のものも穴の形や幅が同じなので利用できる。

一応、レトロ通販でも扱っているのだが、420円/mとかなり高価である。



情報をいただいたところ、海外のサイトで通販しているらしい。50 ftで5.00 USDとお安い。ただし国際発送はFedEx使うらしく、60 USD程度はかかるっぽかった。これでは明らかにレトロ通販で買う方が安いのでよろしくない。


という訳でeBayで探すことにした。“8mm film leader”などと検索するとそこそこ出てくる。super 8用のものを選ぶ(regular 8…ダブル8用のものは穴の形が違うので使えないので注意する)。
送料も表示されるので、安そうなところを選んで購入したら24 USD、三千円以下で購入することができた。あとは発送され届くのを待つのみ。

クレジットカードで決済しようとしたら“The card you entered cannot be used for this payment. Please enter a different credit or debit card number.”とエラーがでてうまく決済できなかった。調べたらすでにPaypalアカウントに登録しているクレジットカードでは使えないという情報があり、Paypalを使って決済を行ったらうまくいった。あるいは住所の入力ミスかもしれないが(順番が違った)。


eBayで購入したお店は独自のWebショップを持ってて、そっちでも買えるらしい。安いかどうかは確認していないけれど、いろいろな商品がある模様。リンクを貼っておく。
filmforevermpe.com


f:id:nixeneko:20170306224541p:plain
一週間ほどで到着した。配送はUSPSの国際郵便。数個一緒に配送しても送料は変らなそうなので、多めに買っておいて必要な人で分けるとかするといいのかもしれない。

f:id:nixeneko:20170306224819p:plain

好きな形にボケるレンズ

f:id:nixeneko:20170225235837p:plain
一眼レフカメラのボケの形を様々に変えて遊んでみたいという話です。

はじめに

一眼レフカメラなどの大きな受光面(センサー)をもつカメラでは、ピントの合う範囲*1が狭く、ピントから外れたところは大きくボケます。
写真ではそのボケがしばしば効果的に使われていて、特にポートレートで人物を浮き立たせるためなど多用されます。

このボケですが、絞りの形*2に沿ってボケます。
絞りは、レンズ内をカメラのレンズを通って入ってくる光の量を制御するためのもので、光の通る穴の広さを変えることでこれを実現しています。絞りを「絞って」光の通る穴を狭くすると、それに従ってボケも小さくなります。

さて、ボケというと丸いイメージがあります。絞りの形に沿ってボケるということですが、絞りの形を好きな形にしたら、その形にボケるのでしょうか?
実際に試してみます。

レンズの絞りを取り換えることはできないので、擬似的に穴をあけた黒画用紙をレンズ前面に置くことで光の通り道を制御します。

用意するもの

  • 一眼レフカメラなどセンササイズの大きいカメラ
  • 単焦点レンズなど明るい(開放F値の小さい)レンズ
  • 黒画用紙
  • カッター
  • レンズプロテクターあるいはテープ(固定用)

手順

黒画用紙をレンズ前面にはまるように丸く切り、好きな形の穴を切り抜きます。うまく出ない可能性があるので、あまり穴が端の方まで来ないようにした方が良さそうです。
f:id:nixeneko:20170224011417p:plain


レンズ前面のフィルタを取り付けるところにはめ、レンズプロテクターを上から取り付けて挟んで固定します。これはテープで貼りつけて固定するのでも構いません。
f:id:nixeneko:20170224011639p:plain
完成。

撮影

絞りを開放にして撮影します。


一点で光っているものだと、ピントが外れた時のボケがわかりやすいです。
光沢のある物体のハイライトだとか、イルミネーションの電飾だとか。街灯とかを遠くから撮影してもきれいです。

今の時期イルミネーションもあまりないので、適当に撮影したものを載せます。あまりいい例ではないですが……。
f:id:nixeneko:20170223234407p:plain
ちゃんと背景のあかるい部分が星形にボケてますね。


ケーキの蝋燭を動画に撮ってみました。ピントリングを回してピントを動かしています。


蝋燭の炎は画面上で結構な面積あるので、ボケた結果も縦長でややいびつな形になってますね。


手元にあったガチャガチャのフィギュアを撮ってみました……といってもここで見たいのは繋がってる鎖の方ですが。
f:id:nixeneko:20170224010749p:plain
鎖の部分のハイライトが星形にボケています。面白いじゃない!


適当な夜の町の写真です。
f:id:nixeneko:20170225235837p:plain
やはり夜景を撮ると良いですね。街灯がきれいな形にボケてくれます。

おまけ

ところで、細かい模様でも再現できるのでしょうか。試しにこんなものを作ってみました。
f:id:nixeneko:20170224013338p:plain


撮影テストしてみるとこんな感じになりました。
f:id:nixeneko:20170224013924p:plain
光が小さい点一つのみでかつ画面中央に来るようにうまいこと調整すると、やや滲んでますがこれくらいは出ます。しかし条件が良くないとぼやけたり重なってよく分からない感じになります。


動画です。LEDのライトは割ときれいな形にぼけてくれます。
中央から外れるとすぐ潰れてしまいますが。

まとめ

  • ピントが合ってる面の前後でボケの向きが反転する
    • ピントが合ってる面より後ろ側だと穴をくり抜いた黒画用紙レンズに嵌めた方向にボケて、ピントが合ってる面より手前側だとレンズに嵌めた向きとひっくり返ってボケるようです。
  • 写真の中心はともかく、画面端のほうはボケが一部欠ける
    • くり抜いた紙をレンズ前面にくっつけてるだけなのである程度仕方ない気がします。

追記(2017-08-02)

絞りの形変えられるレンズ製品もあります。
New Petzval 85 Lens
vimeo.com

参考

実際の世界の一点光がボケて広がる、その広がりを錯乱円 circle of confusion といいます。円なのは絞りが大抵は円やそれに近い形をしてるからでしょうか。
画像処理の流儀 - 焦点深度、被写体深度、絞りとの関係
Circle of confusion - Wikipedia

*1:被写界深度 Depth of Field, DoF、という。

*2:絞りによってつくられる穴の形

PythonでJIS X 0208コードに対応するUnicode値を求める

あるデータセットで、文字情報がJIS X 0208のコードで与えられていたのだが、使い勝手がよくないのでUnicode値に変換しようとした。

やり方

Unicodeコンソーシアムが、JIS X 0208のコードからUnicode値へ変換する変換表を公開している。

今回はこれを使う。ただし、この変換表はobsoleteとなっているので、代りにUnihan Databaseを利用した方が良いのかもしれない。

JIS0208.TXTに曰く、対応表のフォーマットは

#	Format:  Four tab-separated columns
#		 Column #1 is the shift-JIS code (in hex)
#		 Column #2 is the JIS X 0208 code (in hex as 0xXXXX)
#		 Column #3 is the Unicode (in hex as 0xXXXX)
#		 Column #4 the Unicode name (follows a comment sign, '#')

となっているようで、#で始まっている行はコメントとなっているようだ。

コード

"JIS0208.TXT"と同じディレクトリで実行する。

# coding: utf-8

shift_jis = []
jisx0208 = []
unicode = []
with open("JIS0208.TXT", "r") as f:
    for line in f:
        if line[0] == "#":
            pass
        else:
            sjis, jisx, unic, _ = line.strip().split("\t")
            shift_jis.append(int(sjis,16))
            jisx0208.append( int(jisx,16))
            unicode.append(  int(unic,16))

def jis2uni(n):
    return unicode[jisx0208.index(n)]
    
if __name__ == '__main__':
    print("{:x}".format(jis2uni(0x2422)))

jis2uni()関数にJIX X 0208のコードを与えると対応するUnicode値が返ってくるというもの。なおPython 3系なら、Unicode値をchr()で文字(列)に変換できる。