ちょっと長いけど、サンプルソースはこちら。
先に言うと、これ、畳み込み行列処理。
行列の要素の値を全部 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