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が入ってれば勝手に入れてくれるのかもしれない。分からない。
エッジ検出処理
単純な微分方式で検出することにした。
輪郭では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に不慣れなので意外と時間がかかった。