目次 | 前の項目 | 次の項目 | Java 2D API |
image パッケージでは、2 つのインタフェース BufferedImageOp と RasterOp が提供されています。これらのインタフェースはそれぞれが、BufferedImage と Raster に対する操作を定義しています。これらのインタフェースを実装するクラスとしては、AffineTransformOp、BandCombineOp、ColorConvertOp、ConvolveOp、LookupOp、RescaleOp があります。 これらのクラスを使って、イメージに対する幾何学的変換、ぼかし、シャープ化、コントラスト強調、しきい値、色調補正などの処理を行うことができます。
図 5-4 は、輪郭の検出と強調の結果を示したものです。 この操作は、イメージ内の輝度の急な変化を強調するものです。 輪郭の検出は、普通、医療用画像処理や地図アプリケーションで使われます。 輪郭の検出を使うと、イメージ内の隣接する構造の間のコントラストが強くなり、より細部まで識別できるようになります。
次のコードは、輪郭の検出について記述したものです。
float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 4.f, -1.0f, 0.0f, -1.0f, 0.0f}; ... BufferedImage bimg = new BufferedImage(bw,bh,BufferedImage.TYPE_INT_RGB); Kernel kernel = new Kernel(3, 3, elements); ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); cop.filter(bi,bimg);
図 5-5 は、ルックアップテーブル操作の例です。 ルックアップ操作は、ピクセルの個別のコンポーネントを変更する場合に使用できます。
次のコードは、ルックアップテーブル操作について記述したものです。
byte reverse[] = new byte[256]; for (int j=0; j<200; j++){ reverse[j]=(byte)(256-j); } ByteLookupTable blut=new ByteLookupTable(0, reverse); LookupOp lop = new LookupOp(blut, null); lop.filter(bi,bimg);
図 5-6 は、再スケーリングの例です。 再スケーリングでは、すべての点の輝度を強くしたり弱くしたりできます。 再スケーリングを使うと、メリハリのないイメージのダイナミックレンジを拡大して、はっきりしない、または平坦な領域の細部を際立たせることができます。
次のコードは、再スケーリングについて記述したものです。
RescaleOp rop = new RescaleOp(1.5f, 1.0f, null); rop.filter(bi,bimg);
畳み込みは、ほとんどの空間フィルタリングアルゴリズムの基になっている処理です。 畳み込みでは、イメージの各ピクセルの値と周囲のピクセルの値の間で重み付けを行なったり、平均化したりする処理が行われます。 これにより、カーネルで数学的に指定できる方法に従って、出力される各ピクセルに周囲の隣接するピクセルからの影響を反映させることができます。 図 5-7 は、畳み込みの例です。
次に示すコードは、イメージ処理クラスの 1 つである ConvolveOp の使用方法の例です。 次の例では、ソースイメージの各ピクセルは、隣接する 8 つのピクセルと均等に平均化されます。
float weight = 1.0f/9.0f; float[] elements = new float[9]; // create 2D array // fill the array with nine equal elements for (i = 0; i < 9; i++) { elements[i] = weight; } // use the array of elements as argument to create a Kernel private Kernel myKernel = new Kernel(3, 3, elements); public ConvolveOp simpleBlur = new ConvolveOp(myKernel); // sourceImage and destImage are instances of BufferedImage simpleBlur.filter(sourceImage, destImage) // blur the image
変数 simpleBlur には、BufferedImage または Raster のぼかし操作を実装する ConvolveOp の新しいインスタンスが格納されます。 sourceImage と destImage は、BufferedImage の 2 つのインスタンスとします。 ConvolveOp クラスの核となるメソッドの filter を呼び出すと、ソースイメージのピクセルとそれを囲む 8 つのピクセルの値が平均化されて、デスティネーションイメージの対応するピクセルの値に設定されます。この例の畳み込みカーネルは、4 桁の有効数字で指定される要素を持つ次の行列で表されます。
イメージの畳み込みでは、デスティネーションイメージの各ピクセルの値は、そのピクセルの値と周囲のピクセルの値を平均化するときの荷重値の組としてカーネルを使って算出されます。 この操作は、イメージのチャネルごとに行われます。
次の式は、畳み込みを行うときにカーネルの荷重値をソースイメージのピクセルと関連付ける方法を示しています。 カーネルの各値は、イメージの空間位置に結び付けられます。
デスティネーションピクセルの値は、カーネルの荷重値と周囲のソースピクセルの値を掛けた積を合計したものです。 多くの単純な操作では、カーネルは平方で対称の行列であり、荷重値を合計すると 1 になります。 1
この例の畳み込みカーネルは、比較的単純なものです。 このカーネルでは、ソースイメージの各ピクセルが均等に荷重されます。 ほかのカーネルを選択し、ソースイメージに対する荷重レベルを高くしたり低くしたりすることで、デスティネーションイメージの輝度を強くしたり弱くしたりできます。 ConvolveOp コンストラクタで設定される Kernel オブジェクトで、実行されるフィルタリングの種類が決まります。 ほかの値を設定すれば、ぼかし (ガウス、円形、移動など)、シャープ化、平滑化操作など、ほかの種類の積和計算を実行できます。 図 5-8 は、畳み込みを使ったシャープ化の例です。
次に示すコードは、畳み込みを使ったシャープ化の例です。
float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 5.f, -1.0f, 0.0f, -1.0f, 0.0f}; ... Kernel kernel = new Kernel(3,3,elements); ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); cop.filter(bi,bimg);
1. 行列内の過重値の合計が 1 である場合、デスティネーションイメージの輝度はソースと同一です。