スレッド一覧 | 新規スレッド | 留意事項 | ワード検索 | 過去ログ | 管理用 |
icon モノクロ減色フィルタ
日時: 2005/12/07 17:45
名前: 宮田

# レンダリングイメージのモノクロ減色フイルタです。ペイントソフトで容易にできることですけどね(^^;
# 輪郭抽出の前処理工程。うまく動くかは不明です。
#
# wht=イメージ幅、hght=イメージ高、ystp=y軸ステップ幅、xstp=x軸ステップ幅
#
# ステップ幅は必ず1以上にしてください。2以上でストライプが入った画像になります。
# 各ピクセルの再計算を行っているので、画像の大きさによりとんでもなく時間がかかります。
# この画像に輪郭抽出フィルタをかけ、元画像とピクセル演算を行えば輪郭が出ると思います。
# 輪郭抽出計算は面倒なのでパスしますけど、FFTか加重平均フィルタで可能だと思います。
# エラートラップも考えていないし、書式も合っているか判りません。
# 詳しい方で修正が可能な方は修正をお願いします。
#
# 2005 12 6 宮田

show_message_box "モノクロ減色を行います。イメージの大きさを指定してください。"
    set wth 0
    set hght 0
    set ystp 1
    set xstp 1
    begin_dialog
    append_int_dialog_item "幅"
    append_int_dialog_item "高さ"
    append_int_dialog_item "X軸ステップ"
    append_int_dialog_item "Y軸ステップ"
    set_int_property_value 0 to $wth
    set_int_property_value 0 to $hght
    set_int_property_value 0 to $xstp
    set_int_property_value 0 to $ystp
    set ok [ ask_dialog ]
    if { $ok } {
        set wth [ get_int_property_value 0 ]
        set hght [ get_int_property_value 1 ]
        set xstp [ get_int_property_value 2 ]
        set ystp [ get_int_property_value 3 ]
    end_dialog
    } else {
        end_dialog
        error cancel_dialog
    }
set starty 0
set endy $hght
for { set j $starty } { $j <= $endy } {incr j $ystp } {
    set startx 0
    set endx $wth
    for { set i $startx } { $i <= $endx } { incr i $xstp } {
        set list [ read_pixel at { $i $j } ]
        set R1 [ lindex $list 0 ] 
        set G1 [ lindex $list 1 ]
        set B1 [ lindex $list 2 ]
            set am [expr $R1+$G1+$B1]
            if { $am < 1 } {
                write_pixel at { $i $j } to { 0 0 0}
             } elseif { $am < 2 } {
                write_pixel at { $i $j } to { 0.5 0.5 0.5 };#中間調の色指定
             } else {
                write_pixel at { $i $j } to { 1 1 1 }
        }
    }
}
update_image
# --------------------- ここまで ------------------------

モノクロ減色用のスクリプト(もどき)です。
ループ中の式を変えればいろんな効果が出せる可能性があるかと。
ペイントソフトでやれば良いだけの話なんですけどね(^^;
メンテ
Page: [1]

file Re: モノクロ減色フィルタ ( No.1 )
日時: 2005/12/07 21:23
名前: 管理人

宮田さんもスクリプト始められたんですね。
スクリプトでの色処理はずいぶん時間がかかると思っていたんですが、
意外と速いですね。

ちょっと手を加えさせていただきました。
ピクセル処理は結構時間がかかるので、
1行処理するごとにイメージ更新して、ちゃんと動いているということを見せるようにして、
幅、高さは現在のイメージサイズを初期値にするよう変更してみました。

画像処理は単純なモノクロ化と
手抜きの輪郭抽出機能も追加してみました (^^)


#-----ここから -------
proc gray {col} {
    set g [expr ([lindex $col 0] + [lindex $col 1] + [lindex $col 2]) / 3.]
    return [list $g $g $g]
}

proc rinkaku {col col1 col2} {
    set lim 0.2
    set col_step 3.
    set col_g [expr [lindex $col 0] + [lindex $col 1] + [lindex $col 2]]
    set col1_g [expr [lindex $col1 0] + [lindex $col1 1] + [lindex $col1 2]]
    set col2_g [expr [lindex $col2 0] + [lindex $col2 1] + [lindex $col2 2]]
    if {[expr abs($col_g - $col1_g)] > $lim || [expr abs($col_g - $col2_g)] > $lim} {
        return [list 0. 0. 0.]
    } else {
        #    いちおう減色もやってみる
        set r [expr round([lindex $col 0] * $col_step) / $col_step]
        set g [expr round([lindex $col 1] * $col_step) / $col_step]
        set b [expr round([lindex $col 2] * $col_step) / $col_step]
        return [list $r $g $b]
    }
}

set wth $image_width
set hght $image_height
set ystp 1
set xstp 1
begin_dialog
append_int_dialog_item "幅"
append_int_dialog_item "高さ"
append_int_dialog_item "X軸ステップ"
append_int_dialog_item "Y軸ステップ"
append_selection_dialog_item "処理/モノクロ減色/モノクロ/輪郭っぽいの"
set_int_property_value 0 to $wth
set_int_property_value 1 to $hght
set_int_property_value 2 to $xstp
set_int_property_value 3 to $ystp
set_selection_property_value 4 to 0
set ok [ ask_dialog ]
if { $ok } {
    set wth [ get_int_property_value 0 ]
    set hght [ get_int_property_value 1 ]
    set xstp [ get_int_property_value 2 ]
    set ystp [ get_int_property_value 3 ]
    set opr [ get_selection_property_value 4 ]
    end_dialog
} else {
    end_dialog
    error cancel_dialog
}
set starty 0
set endy $hght
for { set j $starty } { $j < $endy } {incr j $ystp } {
    set startx 0
    set endx $wth
    for { set i $startx } { $i < $endx } { incr i $xstp } {
        set list [ read_pixel at { $i $j } ]
        set px_color($i,$j) $list
        set R1 [ lindex $list 0 ] 
        set G1 [ lindex $list 1 ]
        set B1 [ lindex $list 2 ]
        if { $opr == 0 } {
            set am [expr $R1+$G1+$B1]
            if { $am < 1 } {
                write_pixel at { $i $j } to { 0 0 0}
            } elseif { $am < 2 } {
                write_pixel at { $i $j } to { 0.5 0.5 0.5 };#中間調の色指定
            } else {
                write_pixel at { $i $j } to { 1 1 1 }
            }
        } elseif { $opr == 1 } {
            write_pixel at { $i $j } to [gray $list]
        } elseif { $opr == 2 } {
            if {$i > 0 && $j > 0} {
                write_pixel at { $i $j } to [rinkaku $list $px_color([expr $i-1],$j) $px_color($i,[expr $j-1])]
            } else {
                write_pixel at { $i $j } to {1. 1. 1.}
            }
        }
        set last_rgb $list
    }
    update_image
    wait_updating
}
メンテ
file Re: モノクロ減色フィルタ ( No.2 )
日時: 2005/12/07 23:18
名前: 宮田

あ、すごい‥ (^^;

>1行処理するごとにイメージ更新して、ちゃんと動いているということを見せるようにして、

これがあると時間が短く感じられますね。

>宮田さんもスクリプト始められたんですね。

いえ、私は面倒なことを行うつもりはないんです。
私自身はこういった画像処理はフォトレタッチに任せてしまいますし、静止画であれば
描くのには2Dのペイントやドローを使いますから。
ただ、Shadeでもイメージの処理ができるようなのでフィルタ処理もどきも可能かな
ということと、簡単なスクリプトが書ければ形状作成の時間が短縮できるかもという
ことで試してみただけのことだったんですけど。

>スクリプトでの色処理はずいぶん時間がかかると思っていたんですが、
>意外と速いですね。

私も単純に1ピクセルずつ処理するのだともっとかかると思っていましけど、
小さな画像だと結構速いですね。
画像の大きさが大きくなれば加速度的に時間が増えるかもしれませんけど。
メンテ
file Re: モノクロ減色フィルタ ( No.3 )
日時: 2005/12/08 02:03
名前: 管理人

>いえ、私は面倒なことを行うつもりはないんです。
>私自身はこういった画像処理はフォトレタッチに任せてしまいますし、静止画であれば
>描くのには2Dのペイントやドローを使いますから。
>ただ、Shadeでもイメージの処理ができるようなのでフィルタ処理もどきも可能かな
>ということと、簡単なスクリプトが書ければ形状作成の時間が短縮できるかもという
>ことで試してみただけのことだったんですけど。

それが正しいスクリプトとのつきあい方だと思います。
高度なプログラミング知識や開発用のソフトが必要なプラグインと違って、
だれでもちょこちょこっと書いてすぐに使えるものができて
ちょこちょこっと変更できてしまうというのが
スクリプトのいいところですからね。
汎用的に使えるものというより、ユーザーの作業スタイルにあったスクリプトを
ユーザー自身が書くというのが本来の使い方だと思います。

私の場合、変な方向に行っちゃいましたけど・・・(^^;;
メンテ
file Re: モノクロ減色フィルタ ( No.4 )
日時: 2005/12/08 12:58
名前: 宮田

> 汎用的に使えるものというより、ユーザーの作業スタイルにあったスクリプトを
> ユーザー自身が書くというのが本来の使い方だと思います。

ですね。
とは言うものの、スクリプトを公開してくれる作者さんがいるおかげで生産性はかなり高まっていると思います。
ルーチンで行うならともかく、一回の面倒な処理を行う場合、スクリプトを書くのが速いか、力技で手作業を行うか悩みますし、利用可能なスクリプトがあって、使わせて頂けるのなら相当な時間の節約になりますしね。

フイルタの補足
set g [expr ([lindex $col 0] + [lindex $col 1] + [lindex $col 2]) / 3.]
↑この部分が明度に相当する部分ですね。

で、比視感度で補正した場合、
set g [expr ([lindex $col 0]*0.299 + [lindex $col 1]*0.587 + [lindex $col 2]*0.114)]
で補正されます。YCCのY(輝度)もしくはLa*b*やHSLのL(明度)に相当する部分です。
メンテ

親記事を見る

Page: [1]
検索フォームに戻る スレッド一覧 | 新規スレッド | 留意事項 | ワード検索 | 過去ログ | 管理用 |

題名 スレッドをトップへソート
名前
E-Mail
スパムメール対策のため、[表示]にしてもメールアドレスが直接表示されることはありませんが、サンプルのようなメールフォームでメールを受け取ることができます。
メールフォームサンプル サンプル  メールヘッダについて
URL
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
添付ファイル (最大300KBまで gif jpeg png text zip pdf midi swf)
コメント (^^) (^_^) (+_+) (^o^) (^^;) (^_-) (;_;)

(改行、インデントが反映されます)

   クッキー保存