【Lua】tobooleanを実装する
Luaには[tonumber]という値を数値に変換してくれる関数や[tostring]という値を文字列に変換してくれる関数がデフォルトで存在する
しかし[toboolean]の様な、値を[boolean]に変換してくれる関数はデフォルトでは存在しない。
[boolean]という真偽値を表す型が存在するにも関わらずだ。
(ちなみLuaでは[booleanのfalse]と[nil]が偽として扱われ、それ以外の値は全て真となる)
無いならば作るしかない。
ということで、以下の様なコードを作成した。
例: demo.lua
#!/usr/local/bin/lua function toboolean(value) if tostring(value) == 'true' then -- 文字列に変換し、文字列がtrueと一致した場合だけtrueとみなす return true end if tostring(value) == 'false' then -- 文字列に変換し、文字列がfalseと一致した場合だけfalseとみなす return false end return nil -- 変換できない場合はnil end print(toboolean("true")) -- true print(toboolean("false")) -- false print(toboolean("hoge")) -- nil print(toboolean(0)) -- nil print(toboolean(1)) -- nil print(toboolean(nil)) -- nil
ちなみに実行結果は以下の通り。
実行結果:
$lua /demo.lua true false nil nil nil nil
上記のコードには以下の改良の余地がある。
- 値がbooleanに変換できなかった場合(このコードでは全て[nil]になる)にデフォルト値を渡せる様にするべきか
- 渡せる値を文字列に制限するべきか(何らかの値をtostring()に渡したときの挙動によって偶然[true]や[false]に一致することは無いか)
- 数値の1と0はbooleanに変換しなくて良いのか(上記コードではどちらも[nil]になる)
個人的には用途に応じて要求される振る舞いが変わると思っているので、使おうとするときに随時考える必要がある気がする。
【Python】カメラなどで撮影したノイズ混じりの線画を綺麗な白黒に加工する【OpenCV】
本当は別で動画加工をするためにプログラムを作成していたのだが、たまたま別の用途に使用できそうな副産物のプログラムが出来上がったので備忘録として残す。
カメラで撮影した様なノイズ混じりの線画を、パソコン上で彩色しやすい様にはっきりとした白黒に変換するためのプログラムを作成した。
ちなみに使用するのはOpenCVなので「opencv-python」をpipなどでインストールして使える状態にする必要がある。
pip install opencv-python
ちなみにOpenCVというのは画像処理や画像解析のためのライブラリ。
今回はこれのバージョン4.X系を使用する。
(4.Xとそれ以前では、引数や戻り値などに違いがあるので注意)
例: demo.py
#!/usr/bin/python import cv2 # 画像の読み込み image = cv2.imread('target.jpg') # グレースケールに変換 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 閾値で色のついている部分だけを抽出 _, dist = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 画像の吐き出し cv2.imwrite("result.jpg", dist)
変換後の画像は白と黒の二色しかない画像となる。
例:元画像(target.jpg)
例:結果画像(result.jpg)
ちなみにこの時点ノイズの除去は完璧ではない。
「モルフォロジー変換」を使ってうまいこと除去できれば良いのだが、カーネルの指定が恐らくは画像によって調整する必要があるのがちょっと難しい。
記事のタイトルを「塗り絵を作成する」にすればよかった