HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0728
可憐画面の一部をぼかしたい6解決


可憐

リンク

2015/7/28(Tue) 01:50:06|NO.70276

現在ペイントソフトを制作しておりまして
画面の一部をぼかしたいなと思っております。
範囲を指定してからの一部をぼかす方法が分かりません。
サンプル等があれば教えて頂ければ嬉しいです。よろしくお願いします (^^)/



この記事に返信する


Velgail

リンク

2015/7/28(Tue) 03:01:10|NO.70277

ちょっと長いけど、サンプルソースはこちら。
先に言うと、これ、畳み込み行列処理。
行列の要素の値を全部 1.0/9 にすればぼかす感じになる。今のデフォルトだと輪郭線協調っぽい何か。
値を変えたりして試すといいよ。
詳しくは http://docs.gimp.org/2.6/ja/plug-in-convmatrix.html


chdir dirinfo($10027) screen 2,192,140,12 button gosub "画像を開く",*OpenFile pos 64,0 button gosub "画像リセット",*Reset pos 128,0 button gosub "画像処理",*Convolute pos 0,24 button gosub "ランダム(0)",*RandomSet0 pos 64,24 button gosub "ランダム(1)",*RandomSet1 pos 128,24 button gosub "画像保存",*BMPsav ddim convolution,3,3 convolution(0,0)=0.50 :convolution(1,0)=1.00 :convolution(2,0)=0.50 convolution(0,1)=1.00 :convolution(1,1)=-6.0 :convolution(2,1)=1.00 convolution(0,2)=0.50 :convolution(1,2)=1.00 :convolution(2,2)=0.50 dim tooltipid,9 pos 0,48 mes "畳み込み行列" input convolution(0,0) tooltipid(0)=stat input convolution(0,1) tooltipid(1)=stat input convolution(0,2) tooltipid(2)=stat pos 64,66 input convolution(1,0) tooltipid(3)=stat input convolution(1,1) tooltipid(4)=stat input convolution(1,2) tooltipid(5)=stat pos 128,66 input convolution(2,0) tooltipid(6)=stat input convolution(2,1) tooltipid(7)=stat input convolution(2,2) tooltipid(8)=stat stop *OpenFile dialog "bmp|jpg|gif|png",16,"ビットマップイメージ|JPEGイメージ|GIFファイル|Portable Network Graphics" if(stat==0){ return } filename=refstr *Reset gsel 0 picload filename buffer 1,3,ginfo_winy,0,0,0 return *RandomSet for i,0,3 for j,0,3 convolution(i,j)=(0.01*rnd(2000)-10) next next return *ConvolutionRePrint suspend=ginfo_sel gsel 2 for i,0,3 for j,0,3 objprm tooltipid(i*3+j),convolution(i,j) next next gsel suspend return *RandomSet0 do gosub *RandomSet sum=0.0 for i,0,3 for j,0,3 if((i&j)&2){ _continue } sum+=convolution(i,j) next next convolution(2,2)=-sum await until ((convolution(2,2)>-10)&(convolution(2,2)<10)) gosub *ConvolutionRePrint return *RandomSet1 do gosub *RandomSet sum=0.0 for i,0,3 for j,0,3 if((i&j)&2){ _continue } sum+=convolution(i,j) next next convolution(2,2)=-sum+1 await until ((convolution(2,2)>-10)&(convolution(2,2)<10)) gosub *convolutionRePrint return *BMPsav gsel 0 dialog "bmp",17,"ビットマップイメージ" if(stat==0){ return } bmpsave refstr return *Convolute gsel 0 wx=ginfo_winx wy=ginfo_winy for x,0,wx gsel 0 redraw 0 gsel 1 if(x==0){ pos 0,0 gcopy 0,0,0,2,ginfo_winy pos 1,0 gcopy 0,0,0,2,ginfo_winy }else{ pos 0,0 gcopy 1,1,0,2,ginfo_winy if(x==wx-1){ pos 2,0 gcopy 0,wx-1,0,1,ginfo_winy }else{ pos 2,0 gcopy 0,x+1,0,1,ginfo_winy } } for y,0,wy r=0.0 g=0.0 b=0.0 gsel 1 for i,0,3 for j,0,3 pget i,limit(y+j-1,0,ginfo_winy-1) r+=convolution(i,j)*ginfo_r g+=convolution(i,j)*ginfo_g b+=convolution(i,j)*ginfo_b next next gsel 0 color limit(r,0,255),limit(g,0,255),limit(b,0,255) pset x,y await next gsel 0 redraw 1 next return



可憐

リンク

2015/7/28(Tue) 21:19:16|NO.70294

Velgail様
長いソースありがたいのですが
ぼかすというのもアンチエイリアスをかけるようなぼかしかたをしたいです



スペース

リンク

2015/7/29(Wed) 13:20:03|NO.70302

アンチエイリアスとは物体の境界線を滑らかにするものなので、
1枚の画像にアンチエイリアスを掛けるのは無理なのでは?(結局軽いぼかしがかかったように成る)
新しく引く線にアンチエイリアスを掛けたい、ということなら前に似たような質問があったと思います。

ぼかしはVelgailさんのソースコードで出来ますし、OpenCVでも出来ます。
画像を例に説明していただけるとわかりやすくて助かるのですが・・・



kanamaru

リンク

2015/7/29(Wed) 17:03:45|NO.70303

調べてみたところ、gzoomにズームモードというのがあり、アンチエイリアスがかかるそうです。
gzoomは画像を拡大縮小する命令ですが、1倍に拡大(縮小)するようにすればいいです。
アンチエイリアスをかけたい画像をpicloadして、gcopy。
一度白で全体をboxfのあと、
ズームモードでgzoom。
これでいいと思います。



Velgail

リンク

2015/7/29(Wed) 19:39:00|NO.70305

アンチエイリアスってことは高周波成分を消せばいいんだよな。
画像ってことは二次元FFTを使って……

で、高周波成分を消した上で逆変換すればアンチエイリアスがかかる……はず。
(なお、実装する気はあんまり無いです。というかFFT書くのはさすがに面倒くさい)



可憐

リンク

2015/7/29(Wed) 21:39:15|NO.70306

たくさんのご回答ありがとうございます。

よく考えてみたら画像の一部をぼかす=アンチエイリアスではなく、ただのぼかしでしたね

いろいろ頑張ってみます

皆様ありがとうございました



ONION software Copyright 1997-2021(c) All rights reserved.