RMagickでアンチエイリアス処理をしてみた。

画像処理。
アンチエイリアス処理をしてみた。
処理はエッジ検出の応用。
RGB値が大きく変化している箇所を見つけて、中間色に置き換えることで輪郭が滑らかに見えるようにする。

require 'rubygems'
require "RMagick"

include Magick

def antialias(image, t, filename)

threshold = t;
img = ImageList.new(image)
for y in 1...img.rows
  for x in 1...img.columns
    src = img.pixel_color(x, y)

    previous_x = img.pixel_color(x-1, y)
    previous_y = img.pixel_color(x, y-1)

    dr_x = src.red - previous_x.red
    dg_x = src.green - previous_x.green
    db_x = src.blue - previous_x.blue

    dr_y = src.red - previous_y.red
    dg_y = src.green - previous_y.green
    db_y = src.blue - previous_y.blue

    dr = dr_x*dr_x + dr_y*dr_y
    dg = dg_x*dg_x + dg_y*dg_y
    db = db_x*db_x + db_y*db_y

    if dr + dg + db > threshold
      nr = (src.red + previous_x.red + previous_y.red) / 3
      ng = (src.green + previous_x.green + previous_y.green) / 3
      nb = (src.blue + previous_x.blue + previous_y.blue) / 3
      color = Magick::Pixel.new(nr, ng, nb)
      img.pixel_color(x, y, color)
    end
  end
end

img.write filename
end

image = ARGV[0]
t = ARGV[1]
filename = ARGV[2]
antialias(image, t.to_i, filename)

本日の実験画像はこちら。
日本のMANGA的白黒文化に染まってしまったデストロイマンさんです。

ruby ./antialias.rb 100000 test.jpg

結果。

心無しか滑らかになった。分かりづらいので股間を拡大。


ジャギーがある程度消えて滑らかになっている!
やったね!

RMagickで乗算合成をしてみた。

引き続き画像処理。ピクセル楽しい。

今回は乗算合成をやってみた。
乗算合成では、合成後の色を次の式で算出する。
元画像の色 * 合成画像の色 / 256 = 合成後の色

require 'rubygems'
require "RMagick"

include Magick

def multipleconb(image1, image2)

img1 = ImageList.new(image1)
img2 = ImageList.new(image2)
for y in 0...img1.rows-1
  for x in 0...img1.columns-1
    src1 = img1.pixel_color(x, y)
    src2 = img2.pixel_color(x, y)

    # 二つの画像からRGB値ごとに合成色を算出
    m_red = src1.red * src2.red / 256
    m_green = src1.green * src2.green / 256
    m_blue = src1.blue * src2.blue / 256

    color = Magick::Pixel.new(m_red, m_green, m_blue)

    img1.pixel_color(x, y, color)
  end
end

img1.write "test.jpg"
end

image1 = ARGV[0]
image2 = ARGV[1]
multipleconb(image1, image2)

今回の実験画像はこちら。
ハイレグサイエンティスト、ナオミ博士と
ゴスロリ殺人四番バッター、バッドガールさんです。

ruby ./multipleconb.rb image/naomi.jpg image/badgirl.jpg

結果。処理的には正常だけど画像的にはよくわからないものになった。




おまけ。


同じ画像にしきい値と色の違う二値化処理を施して乗算合成すると影がついたような効果がでてカッコイイ!

RMagickで二値化処理をしてみた。

前回やったエッジ検出が思いのほか楽しかったので二値化処理もやってみた。

処理は超単純。
ピクセルごとにRGB値を合計、しきい値を超えたら白、超えなかったら黒で置き換える。

equire 'rubygems'
require "RMagick"

include Magick

def binarize(file, t)

white = Magick::Pixel.new(255, 255, 255)
black = Magick::Pixel.new(0, 0, 0)
threshold = t;

img = ImageList.new(file)
for y in 0...img.rows-1
  for x in 0...img.columns-1
    src = img.pixel_color(x, y)

    brightness = src.red + src.green + src.blue

    if brightness > threshold
      img.pixel_color(x, y, white)
    else
      img.pixel_color(x, y, black)
    end
  end
end

img.write "test.jpg"
end

image = ARGV[0]
t = ARGV[1]
binarize(image, t.to_i)

本日の実験画像はこちら。昼はお堅い公務員、夜は変態コスプレ殺し屋。
ドグサレヒーローことデストロイマンさんです。

ruby ./binarize.rb image/destroyman.jpg 535

結果。予想以上にカッコ良くなった!!

RMagickで簡単なエッジ検出をしてみた。

macportsインストール

そういえば買い替えてからmacportsを入れてなかったので
http://svn.macosforge.org/repository/macports/downloads/からdmgを持って来てインストール。

ImageMagickインストール

http://rmagick.rubyforge.org/install-osx.html を参考にインストール。

# sudo port install tiff -macosx imagemagick +q8 +gs +wmf

.
.
.
Error: The following dependencies failed to build: jpeg zlib

zlibとjpegが無いとか言われたのでとりあえずzlibをインストール

# sudo port install zlib

入ったっぽいので試しにもう一度ImageMagickをインストールしてみる。

# sudo port install tiff -macosx imagemagick +q8 +gs +wmf

入った。あれ?jpegは入れてないのに…。
zlibが入ってれば勝手に入れてくれるのかもしれない。分からない。

RMagickインストール

mac 10.5にデフォルトで入ってるrubygemsを使用

# sudo gem install rmagick

すんなり入った。

エッジ検出処理

単純な微分方式で検出することにした。
輪郭ではRGB値が急激に変化すると考えられるので
RGB値それぞれで微分し、傾きがしきい値を超えたら輪郭だと判断する。

require 'rubygems'
require "RMagick"

include Magick

def edgedetect(file)

white = Magick::Pixel.new(255, 255, 255)
black = Magick::Pixel.new(0, 0, 0)
threshold = 12000;

img = ImageList.new(file)
red_array = Array.new
for y in 0...img.rows-1
  for x in 0...img.columns-1
    src = img.pixel_color(x, y)
    next_x = img.pixel_color(x+1, y)
    next_y = img.pixel_color(x, y+1)

    dr_x = src.red - next_x.red     # 対象座標の一つ右のピクセルとのRGB差分を計算(x軸傾き)
    dg_x = src.green - next_x.green
    db_x = src.blue - next_x.blue

    dr_y = src.red - next_y.red     # 対象座標の一つ下のピクセルとのRGB差分を計算(y軸傾き)
    dg_y = src.green - next_y.green
    db_y = src.blue - next_y.blue

    dr = dr_x*dr_x + dr_y*dr_y      # 対象座標のRGBごとの傾きを算出
    dg = dg_x*dg_x + dg_y*dg_y
    db = db_x*db_x + db_y*db_y

    if dr + dg + db > threshold     # 傾きの合計がしきい値を超えていれば黒、以下なら白を出力(黒が輪郭)
      img.pixel_color(x, y, black)
    else
      img.pixel_color(x, y, white)
    end
  end
end

img.write "holly_edge.jpg"
end

image = ARGV
edgedetect(image)

本日の実験画像はこちら。
モデルでありながら全米殺し屋ランキング6位というマルチな才能と美貌を併せ持つホリーさんです。

画像を指定して実行。

# ruby ./edgedetect.rb image/holly.jpg

結果。エッジ検出しても相変わらず美しいホリーさん。

apache httpd.confでのアクセス制限の条件にANDを使う

例えばドコモ端末の場合だけIP制限もかけたい時とか。
そんな場合があるのかどうかは置いといて、とりあえず出来たので書く。

SetEnvIf Remote_Addr "^(210.153.84|210.136.161|210.153.86|124.146.174|124.146.175)" is_valid_ip
BrowserMatch "^DoCoMo" is_docomo
SetEnvIf is_docomo "^$" !is_valid_ip

BrowserMatch "^(J-PHONE|Vodafone|SoftBank|KDDI|UP.Browser)" other_valid_mobile

<Location />
Order Deny,Allow
Deny from All
Allow from env=is_valid_ip
Allow from env=other_valid_mobile
</Location>

環境変数is_docomoが存在しない場合is_valid_ipもunsetするので、両方がマッチした場合のみアクセスが許可される。
もっと簡単な方法がある気がしてならないのだけども。

twitter bot「cupidder」作ったー

cupidderをフォローしてしばらくするとフォロー返しされる。
フォローされた状態で「彼女欲しい」or「彼氏欲しい」と発言すると、同じように発言した相手をcupidderが紹介してくれるよ!

id:maraigueさんのtwbotを使ってみて、うひょーこれならすぐ作れるじゃーんと思ったら、rubyに不慣れなので意外と時間がかかった。