画像の輪郭を強調する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
RAZ

画像の輪郭を強調する

#1

投稿記事 by RAZ » 15年前

DXライブラリを使っております。

キャラクターが選択されている時に
輪郭を強調しようと思います。

ただこの為だけに画像をもう一枚用意するのは手間なので
プログラムで行おうと考えております。

Aの画像を読み込んである処理をして表示するとBの画像が表示されるようにしたいです。
このようなことはできないのでしょうか?

kazuoni

Re:画像の輪郭を強調する

#2

投稿記事 by kazuoni » 15年前

> ただこの為だけに画像をもう一枚用意するのは手間なので
恐らく余分に用意する方がはるかに楽かと思います。

無理やりソフト内で処理するには、以下の二通りが考えられるかと思います。

1、画像をマスク処理し、拡大する
これは単純ですが。
まず、イメージをマスク化し、
背景以外の部分をくりぬきます。くり抜いたところは
画像の枠外の色にしたい色で塗りつぶし、それ以外(背景)を黒で塗りつぶしてください。
もし線を黒にしたいなら背景を白にしてください。(描写する際には、背景色を白に変えなければならない)
次に出来た画像を拡大します。縦横ともに同じ比率です。
(拡大してからマスクコピーでもよいと思いますが)
640*480ならば1.01倍とかでもよいかと。
ただ、小数点以下は切り捨てられるので、縦横で若干枠の大きさが変わるかと思いますが。
最後に描写する際、二つの画像の中心点を同じにさせればOKです。

2、エッジ抽出→エッジ拡大
綺麗にエッジを抽出するには、ラプラシアンフィルタとかですかね。
(詳しくはないので、他にもっと良いフィルタがあるかもしれませんが。)
これは結構難しいかもです。
例えば、画像の背景以外にも文字の部分の周り(DOTの文字)も枠描写したい
なんて時にはこのエッジ抽出が必須かと思います。

が、詳しく書こうとすると、長くなりそうで、
実際に自分で作るのも大変そうなので、省略します^^; 画像

RAZ

Re:画像の輪郭を強調する

#3

投稿記事 by RAZ » 15年前

ご回答ありがとう御座います。
今までマスク処理をしたことがないので
原理が理解できません・・・。

本家を調べて書いてみたのですが何も表示されません。
MaskHandleに表示したい画像のマスクを読み込んであります。
CreateMaskScreen() ;
    DrawMask( 200 , 200 , MaskHandle , DX_MASKTRANS_NONE ) ;
    DeleteMaskScreen() ;
画像はpngを使っております。
なぜなのでしょうか・・・。

たいちう

Re:画像の輪郭を強調する

#4

投稿記事 by たいちう » 15年前

> 今までマスク処理をしたことがないので
> 原理が理解できません・・・。

マスク処理の原理ですか?
それともkazuoniさんが説明しているアルゴリズムの原理ですか?

もし両方判らないならば、まず理解すべきなのはアルゴリズムの方です。
任意の画像(旗)を与えられて、輪郭を強調した画像を作る時に
どのように作業しますか?

PhotoShopやイラストレーター等で作業することが多いかもしれませんが、
ここでは64×64の方眼紙に絵が描かれていると思ってください。
そして作業するのは全くセンスの無いバイト君ですが、
あなたの指示に忠実に従います。
画像はまだ届いていないので、あなたも見たことはありませんが、
今から外出するので、画像を見る前にバイト君に指示を出さないといけません。
どのような指示を出したらよいでしょうか?

というのがアルゴリズムです。
方眼紙と色鉛筆を持ったバイト君に指示を与えるだけなので、
プログラミングは関係ありません。RAZさんも考えてみて下さい。
自分で考えた後ならば、kazuoniさんの書いていることも判りやすいでしょう。
プログラミングはその後です。

Ma

Re:画像の輪郭を強調する

#5

投稿記事 by Ma » 15年前

くろぶちの方法なら簡単ですけどね。

透明度処理がしてある画像なら
色調を変えるというか、輝きの色を変える関数があったから、
SetDrawBright だったかな
これで全部0にしてから、拡大描画で黒い状態が描画できます。
これで黒いわくぶちはできますね。
色はもっと工夫しないといけないでしょうけど。

RAZ

Re:画像の輪郭を強調する

#6

投稿記事 by RAZ » 15年前

皆様ご回答ありがとうございます。
回答を頂けて本当にうれしいです。

アルゴリズムにつきましてはやることはなんとなくわかります・・・。

1、マスクを作る。
2、作ったマスクを拡大
3、表示場所をあわせて表示

ということですよね? ※違ってたらすみません。
出来れば輪郭の色はキャラごとに変えたいです。(敵なら赤、味方なら青みたいなかんじです)
マスク画像は表示されているようなのですが
これを拡大するにはどうすれば良いのでしょうか・・・。
又、現在マスク画像が最前面に配置されてしまう為
H_charが隠れてしまいます・・・。

H_charとMaskHandleは同じ画像です。
     // マスク画面を作成します
    CreateMaskScreen() ;
    // ロードしたマスクデータを描画します
    DrawMask( 200 , 200 , MaskHandle , DX_MASKTRANS_NONE ) ;
    DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 0 , 0 ) , TRUE ) ;
    DrawGraph( 180, 180 , H_char , true ) ; // 確認用に200,200からずらしてます
    // マスク画面を削除します
    DeleteMaskScreen() ;

SooA

Re:画像の輪郭を強調する

#7

投稿記事 by SooA » 15年前

マスク有効中にキャラ描画してるのでキャラが隠れるのでしょう。

マスクについて。
例えば以下のようなマスクデータがあり、
データと同じ範囲を紫色で塗りつぶすと、
■の部分だけ塗りつぶされる事になります。
□□□□□□□□
□□■■■■□□
□■■■■■■□
□■■■■■■□
□■■■■■■□
□■■■■■■□
□□■■■■□□
□□□□□□□□

■黒 □白 です。投稿すると色が反転しました><
マスクデータの拡大について。
拡大ではないですが、上下左右(斜めも入れると良い)に
ずらして塗りつぶしてから、中央にキャラを描画すれば
似たような事はできますよ。

ただ、どのみちマスクデータを作るなら、
選択済みの画像を用意した方が遙かに簡単で
綺麗なものになると思います。

※非公開関数にマスクの拡大できる関数があったらごめんなさいです。
 CPUイメージを使う方法も省かせてもらいます。
画像

kazuoni

Re:画像の輪郭を強調する

#8

投稿記事 by kazuoni » 15年前

とりあえず、やっつけで作ってみました。
30分ぐらいで作ったので、思わぬバグがあるかもしれませんが・・・
アイシャさんはうまくいってるようです。

http://kazuoni.kumogakure.com/result.png

つながりにくいかもしれないので、
コピぺでよろしくお願いします。

もっとスマートな書き方があるかもしれませんが。。 画像

kazuoni

Re:画像の輪郭を強調する

#9

投稿記事 by kazuoni » 15年前

あ、よくみたら独立した点が数点ありますねw
元絵にアルファ値が入っているのでしかたないですかね。
これはドットを特定して、ペイントソフトで潰していくしかないかと。
(もしかしたらプログラムがだめなのかもしれないです・・・)

バグ

Re:画像の輪郭を強調する

#10

投稿記事 by バグ » 15年前

ぶっちゃけ、別途画像を用意した方が楽なうえに早いのではないかと…(^_^;)
2値化して、拡大して、着色した画像に、元画像を重ねてやる…と。手作業でもそんなに手間ではないと思いますよ。

RAZ

Re:画像の輪郭を強調する

#11

投稿記事 by RAZ » 15年前

皆様ご回答ありがとう御座います。
今の私のPG力ではできそうにないので画像に手を加えることにしました。

サンプルソースありがとう御座います。
サンプルなのですがnamespace(名前空間?)がよく理解できませんでした。
せっかく作っていただいたのに申し訳ございません。

皆様のお時間を頂戴したのに作ることができず
お詫びさせて下さい。

ご回答ありがとう御座いました。

kazuoni

Re:画像の輪郭を強調する

#12

投稿記事 by kazuoni » 15年前

> ぶっちゃけ、別途画像を用意した方が楽なうえに早いのではないかと…(^_^;)

個人的にも同感ですね。
もし、画像が数百枚ある場合は別ですが。。
GIMPなんて使ったらかなり早く画像ができてしまいますよね。

> namespace(名前空間?)がよく理解できませんでした。

これはコーティングの問題なんで、省いてもらって構いません。
詳しく知りたければ、[C++ namespace]でググれば参考サイトが出てくるかと思います。

#あ・・・途中がおかしかったですね。
修正したファイルを添付しておきます。
大変失礼しました。

閉鎖

“C言語何でも質問掲示板” へ戻る