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

フィルター処理だけであれば、imfilter で簡単に行うことが出来る。
今回は、画像の拡大・縮小の処理を行ってみる。
最終的には、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 ブロックに処理が移る。
とりあえず今日はここまで。