julia - 拡大・縮小 ― 2015年06月12日 18:14

フィルター処理だけであれば、imfilter で簡単に行うことが出来る。
今回は、画像の拡大・縮小の処理を行ってみる。
最終的には、imgzoom( img, xsize, ysize) という関数で、画像を拡大・縮小できるようにしたい。
任意サイズに画像を拡大・縮小する場合、画素の補間が必要となる。
ここでは、bicubic 法で補完を行う。
バイキュービックでは、周辺の16画素を用いて補完を行う。この際には、補完係数に3次関数を用いるので cubic と呼ばれるようだ。ちなみに、この補完係数は、sinc関数を3次近似したものらしい。
ということで、(x,y) の周辺16画素を取得する関数をまずは作ってみる。
簡単に書けばこんな感じか。
しかし、これを毎回行うのは効率的ではないので、エラーが発生した時だけ真面目に処理をするようにした。(ちょっとだけ早い)
とりあえず今日はここまで。
今回は、画像の拡大・縮小の処理を行ってみる。
最終的には、imgzoom( img, xsize, ysize) という関数で、画像を拡大・縮小できるようにしたい。
任意サイズに画像を拡大・縮小する場合、画素の補間が必要となる。
ここでは、bicubic 法で補完を行う。
バイキュービックでは、周辺の16画素を用いて補完を行う。この際には、補完係数に3次関数を用いるので cubic と呼ばれるようだ。ちなみに、この補完係数は、sinc関数を3次近似したものらしい。
ということで、(x,y) の周辺16画素を取得する関数をまずは作ってみる。
簡単に書けばこんな感じか。
function getPIX4x4 (img, x, y)
xstart= ifloor(x) - 1
ystart= ifloor(y) - 1
return img[xstart:(xstart+3), ystart:(ystart+3)]
end
ただし、これだと、x=1 の時(左端)や右端の時に img の添え字をはみ出してしまうので、x, y の値のチェックが必要。しかし、これを毎回行うのは効率的ではないので、エラーが発生した時だけ真面目に処理をするようにした。(ちょっとだけ早い)
function getPIX4x4 (img, xin, yin)
xstart= ifloor(xin) - 1
ystart= ifloor(yin) - 1
try
return img[xstart:(xstart+3), ystart:(ystart+3)]
catch
buff= img[1:4,1:4]
(xmax,ymax)= size(img)
for x= 1:4, y= 1:4
xpos= xstart + (x - 1)
ypos= ystart + (y - 1)
xpos= (xpos < 1) ? 1 : (xpos > xmax) ? xmax : xpos
ypos= (ypos < 1) ? 1 : (ypos > ymax) ? ymax : ypos
buff[x,y]= img[xpos,ypos]
end
return buff
end
end
try ブロックを処理中にエラーが生じると catch ブロックに処理が移る。とりあえず今日はここまで。
最近のコメント