互いに素の視覚化, 選択的二値化 (2013/04/28)


世界の端を互いに素な数で塗りつぶす, いくらでもある冴えないやり方

最大公約数を計算するメソッドは公式のものが最近存在してる事に気づいて, そっちに乗り換えた記念の記事です.

  def gcd(arg)
    if (rem=self%arg) == 0
      arg
    else
      arg.gcd(rem)
    end
  end

いままでは, こんなようなものを書いて使っていました.

最大公約数を計算できれば互いに素というのも計算できるので, 互いに素なところを100*100の升目に塗ってみる.

パタンがおもしろい(自画自賛).

まず互いに素な数値ペアを取り出そう. 変数 r に1から100の整数をいれておく.

r.map{|i|r.map{|ii|i.coprime(ii)}.compact}.inject([]){|r,e|r+e}

メソッド coprime は self と 引数の gcd を計算して 1 なら [self, 引数] を返し, そうでなければ nil というものである. これで互いに素な数値ペアのリストができた.

こういう視覚化は, 通り一遍でいいのなら gnuplot が間違いないところ. 今回ならば整数一組につき一行でどこかに出力し, その整数値ペアを座標として, 適当な寸法の四角いボッチで散布図を描けばできあがりだ.

gnuplot> plot "coprime.plot" with points pointtype 5 pointsize 1

撮影して図面とか文字を取り出す

デジカメで紙とかホワイトボードを撮影すると, 照明の加減やレンズの特性で, 紙やボードが同じ色や明るさにならず, 無意味にファイルがでかくなったり読みにくかったりするので, なんとかゼロックスしたみたいな感じの画像にできないものか, と考えてみた.

選択ガウスぼかし > ガウス差分で輪郭抽出 > レベル調整で中間色を全部黒にとばす

という段取りでだいたいの場合は達成可能. ガウス差分ってのは, 濃淡差があると, その部分はガウスぼかしをかけたときのぼけ加減が違うので, 差分をとったら濃淡差がある部分だけ残るので輪郭が抽出できる, というアルゴリズムである. 移動平均をかけて差分をとることで, トレンドを除去するハイパスフィルタと言ってもいい.


記事リストへ