フィルター行列をあらわす Kernel クラスとその処理を行う ConvolveOp クラスでいろいろと画像処理することが可能。

カラー画像をいろいろと加工した結果

Pink on Flickr - Photo Sharing! (by owen-jp). の画像をいろいろと処理してみる。

元画像
元画像


BLUR33_FILTER_MATRIX
BLUR33_FILTER_MATRIX

BLUR55_FILTER_MATRIX
BLUR55_FILTER_MATRIX

BLUR77_FILTER_MATRIX
BLUR77_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX

MOTION_BLUR_FILTER_MATRIX
MOTION_BLUR_FILTER_MATRIX

SHARPNESS_TYPE1_FILTER_MATRIX
SHARPNESS_TYPE1_FILTER_MATRIX

SHARPNESS_TYPE2_FILTER_MATRIX
SHARPNESS_TYPE2_FILTER_MATRIX

SHARPNESS_TYPE3_FILTER_MATRIX
SHARPNESS_TYPE3_FILTER_MATRIX

SHARPNESS_TYPE4_FILTER_MATRIX
SHARPNESS_TYPE4_FILTER_MATRIX

MEXICAN_HAT_77_FILTER_MATRIX
MEXICAN_HAT_77_FILTER_MATRIX

EMBROSSING_FILTER_MATRIX
EMBROSSING_FILTER_MATRIX

EDGE_TYPE1_FILTER_MATRIX
EDGE_TYPE1_FILTER_MATRIX

EDGE_TYPE2_FILTER_MATRIX
EDGE_TYPE2_FILTER_MATRIX

EDGE_TYPE3_FILTER_MATRIX
EDGE_TYPE3_FILTER_MATRIX

EDGE_TYPE4_FILTER_MATRIX
EDGE_TYPE4_FILTER_MATRIX

EDGE_TYPE5_FILTER_MATRIX
EDGE_TYPE5_FILTER_MATRIX

DILATION_FILTER_MATRIX
DILATION_FILTER_MATRIX

EROSION_FILTER_MATRIX
EROSION_FILTER_MATRIX

BrightnessFilterMatrix05
BrightnessFilterMatrix05

BrightnessFilterMatrix20
BrightnessFilterMatrix20

白黒2値画像をいろいろと加工した結果

Pink on Flickr - Photo Sharing! (by owen-jp). を白黒2値画像にしたものをベースにいろいろと画像処理してみる。

元画像
元画像

BLUR33_FILTER_MATRIX
BLUR33_FILTER_MATRIX

BLUR55_FILTER_MATRIX
BLUR55_FILTER_MATRIX

BLUR77_FILTER_MATRIX
BLUR77_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX

WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX
WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX

MOTION_BLUR_FILTER_MATRIX
MOTION_BLUR_FILTER_MATRIX

SHARPNESS_TYPE1_FILTER_MATRIX
SHARPNESS_TYPE1_FILTER_MATRIX

SHARPNESS_TYPE2_FILTER_MATRIX
SHARPNESS_TYPE2_FILTER_MATRIX

SHARPNESS_TYPE3_FILTER_MATRIX
SHARPNESS_TYPE3_FILTER_MATRIX

SHARPNESS_TYPE4_FILTER_MATRIX
SHARPNESS_TYPE4_FILTER_MATRIX

MEXICAN_HAT_77_FILTER_MATRIX
MEXICAN_HAT_77_FILTER_MATRIX

EMBROSSING_FILTER_MATRIX
EMBROSSING_FILTER_MATRIX

EDGE_TYPE1_FILTER_MATRIX
EDGE_TYPE1_FILTER_MATRIX

EDGE_TYPE2_FILTER_MATRIX
EDGE_TYPE2_FILTER_MATRIX

EDGE_TYPE3_FILTER_MATRIX
EDGE_TYPE3_FILTER_MATRIX

EDGE_TYPE4_FILTER_MATRIX
EDGE_TYPE4_FILTER_MATRIX

EDGE_TYPE5_FILTER_MATRIX
EDGE_TYPE5_FILTER_MATRIX

DILATION_FILTER_MATRIX
DILATION_FILTER_MATRIX

EROSION_FILTER_MATRIX
EROSION_FILTER_MATRIX

BrightnessFilterMatrix05
BrightnessFilterMatrix05

BrightnessFilterMatrix20
BrightnessFilterMatrix20

ソースコード


import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
 
public class ImageProcessing {
 
  public static void main(String[] args) throws Exception {
    BufferedImage src = ImageIO.read(new File("src.jpg"));
    String format = "jpg";
    test(src, format);
  }
  
  private static void test(BufferedImage src, String format) throws Exception {
    
    src = normalize(src);
    
    Kernel[] k = new Kernel[]{
      BLUR33_FILTER_MATRIX,
      BLUR55_FILTER_MATRIX,
      BLUR77_FILTER_MATRIX,
      WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX,
      WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX,
      WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX,
      MOTION_BLUR_FILTER_MATRIX,
      SHARPNESS_TYPE1_FILTER_MATRIX,
      SHARPNESS_TYPE2_FILTER_MATRIX,
      SHARPNESS_TYPE3_FILTER_MATRIX,
      SHARPNESS_TYPE4_FILTER_MATRIX,
      MEXICAN_HAT_77_FILTER_MATRIX,
      EMBROSSING_FILTER_MATRIX,
      EDGE_TYPE1_FILTER_MATRIX,
      EDGE_TYPE2_FILTER_MATRIX,
      EDGE_TYPE3_FILTER_MATRIX,
      EDGE_TYPE4_FILTER_MATRIX,
      EDGE_TYPE5_FILTER_MATRIX,
      DILATION_FILTER_MATRIX,
      EROSION_FILTER_MATRIX,
      getBrightnessFilterMatrix(0.5f),
      getBrightnessFilterMatrix(2.0f),
    };
    
    String[] n = new String[]{
      "BLUR33_FILTER_MATRIX",
      "BLUR55_FILTER_MATRIX",
      "BLUR77_FILTER_MATRIX",
      "WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX",
      "WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX",
      "WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX",
      "MOTION_BLUR_FILTER_MATRIX",
      "SHARPNESS_TYPE1_FILTER_MATRIX",
      "SHARPNESS_TYPE2_FILTER_MATRIX",
      "SHARPNESS_TYPE3_FILTER_MATRIX",
      "SHARPNESS_TYPE4_FILTER_MATRIX",
      "MEXICAN_HAT_77_FILTER_MATRIX",
      "EMBROSSING_FILTER_MATRIX",
      "EDGE_TYPE1_FILTER_MATRIX",
      "EDGE_TYPE2_FILTER_MATRIX",
      "EDGE_TYPE3_FILTER_MATRIX",
      "EDGE_TYPE4_FILTER_MATRIX",
      "EDGE_TYPE5_FILTER_MATRIX",
      "DILATION_FILTER_MATRIX",
      "EROSION_FILTER_MATRIX",
      "BrightnessFilterMatrix05",
      "BrightnessFilterMatrix20",
    };
    
    for(int i=0; i<k.length; i++){
      ImageIO.write(
        getFilteredImage(src, k[i]),
        format,
        new File(n[i] + "." + format));
    }
  }
 
  private static BufferedImage normalize(BufferedImage src){
    // ImagingOpException がでるとイヤなので、BufferedImage を作りなおす
    // in thread "main" java.awt.image.ImagingOpException: Unable to convolve src image
    //   at java.awt.image.ConvolveOp.filter(ConvolveOp.java:180)
    BufferedImage dst =
      new BufferedImage(
        src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = dst.createGraphics();
        g.drawImage(src, 0, 0, null);
        g.dispose();
        return dst;
  }
  
  private static BufferedImage getFilteredImage(BufferedImage src, Kernel filterMatrix) {
    
    BufferedImage dst =
      new BufferedImage(
        src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
    ConvolveOp op = new ConvolveOp(filterMatrix);
    op.filter(src, dst);
 
    return dst;
  }
 
  /**
   * Blur(ぼかし)フィルタ行列(3x3)。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 109ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel BLUR33_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
      }
    );
      
  /**
   * Blur(ぼかし)フィルタ行列(5x5)。
   * Ref. CodeZine:Javaにおけるイメージのフィルタ処理(グラフィック, java)
   *      http://codezine.jp/a/article/aid/1145.aspx?p=4
   */
  private static final Kernel BLUR55_FILTER_MATRIX =
    new Kernel(
      5, 5,
      new float[] {
        1/25f, 1/25f, 1/25f, 1/25f, 1/25f,
        1/25f, 1/25f, 1/25f, 1/25f, 1/25f,
        1/25f, 1/25f, 1/25f, 1/25f, 1/25f,
        1/25f, 1/25f, 1/25f, 1/25f, 1/25f,
        1/25f, 1/25f, 1/25f, 1/25f, 1/25f,
      }
    );
  
  /**
   * Blur(ぼかし)フィルタ行列(7x7)。
   */
  private static final Kernel BLUR77_FILTER_MATRIX =
    new Kernel(
      7, 7,
      new float[] {
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
        1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f, 1/49f,
      }
    );
  
  /**
   * 加重平均(画像をなめらかにする)フィルタ行列(3x3)。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 113ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel WEIGHTED_AVERAGE_TYPE1_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        1/10f, 1/10f, 1/10f,
        1/10f, 2/10f, 1/10f,
        1/10f, 1/10f, 1/10f,
      }
    );
      
  /**
   * 加重平均(画像をなめらかにする)フィルタ行列(3x3)。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 113ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel WEIGHTED_AVERAGE_TYPE2_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        1/16f, 2/16f, 1/16f,
        2/16f, 4/16f, 2/16f,
        1/16f, 2/16f, 1/16f,
      }
    );
      
  /**
   * 加重平均(画像をなめらかにする)フィルタ行列(3x3)。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 113ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel WEIGHTED_AVERAGE_TYPE3_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        0/5f, 1/5f, 0/5f,
        1/5f, 1/5f, 1/5f,
        0/5f, 1/5f, 0/5f,
      }
    );
 
  /**
   * モーションブラー(高速で動いているような効果を出すぼかし)フィルタ行列。
   * Ref. CodeZine:Javaにおけるイメージのフィルタ処理(グラフィック, java)
   *      http://codezine.jp/a/article/aid/1145.aspx?p=4
   */
  private static final Kernel MOTION_BLUR_FILTER_MATRIX =
    new Kernel(
      10, 1,
      new float[] { // 横方向のピクセルの輝度を平均化
        1/10f, 1/10f, 1/10f, 1/10f, 1/10f, 1/10f, 1/10f, 1/10f, 1/10f, 1/10f,
      }
    );
  
  /**
   * 鮮明化(シャープネス)フィルタ行列。
   * Ref. CodeZine:Javaにおけるイメージのフィルタ処理(グラフィック, java)
   *      http://codezine.jp/a/article/aid/1145.aspx?p=4
   */
  private static final Kernel SHARPNESS_TYPE1_FILTER_MATRIX =
    new Kernel(
      5, 5,
      new float[] { // 隣り合う画素の濃度値を大きくする
        -0.1f, -0.1f, -0.1f, -0.1f, -0.1f,
        -0.1f, -0.1f, -0.1f, -0.1f, -0.1f,
        -0.1f, -0.1f,  3.4f, -0.1f, -0.1f,
        -0.1f, -0.1f, -0.1f, -0.1f, -0.1f,
        -0.1f, -0.1f, -0.1f, -0.1f, -0.1f,
      }
    );
  
  /**
   * 鮮明化(シャープネス)フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 117ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel SHARPNESS_TYPE2_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] { // 隣り合う画素の濃度値を大きくする
         0f, -1f,  0f,
        -1f,  5f, -1f,
         0f, -1f,  0f,
      }
    );
 
  /**
   * 鮮明化(シャープネス)フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 117ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel SHARPNESS_TYPE3_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] { // 隣り合う画素の濃度値を大きくする
        -1f, -1f, -1f,
        -1f,  9f, -1f,
        -1f, -1f, -1f,
      }
    );
 
  /**
   * 鮮明化(シャープネス)フィルタ行列。
   * Ref. Image Sharpening with a Laplacian Kernel
   *      http://www.dfanning.com/ip_tips/sharpen.html
   */
  private static final Kernel SHARPNESS_TYPE4_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] { // 隣り合う画素の濃度値を大きくする
        -1f, -1f, -1f,
        -1f,  8f, -1f,
        -1f, -1f, -1f,
      }
    );
 
  /**
   * Mexican hat フィルタ行列。
   * Ref. The Image Processing Handbook (by John C. Russ)
   *      http://www.amazon.co.jp/exec/obidos/ASIN/0849372542/nilabz3-22/ref=nosim/
   *      [Second Edition P232]
   */
  private static final Kernel MEXICAN_HAT_77_FILTER_MATRIX =
    new Kernel(
      7, 7,
      new float[] {
         0f,  0f, -1f, -1f, -1f,  0f,  0f,
         0f, -1f, -3f, -3f, -3f, -1f,  0f,
        -1f, -3f,  0f,  7f,  0f, -3f, -1f,
        -1f, -3f,  7f, 24f,  7f, -3f, -1f,
        -1f, -3f,  0f,  7f,  0f, -3f, -1f,
         0f, -1f, -3f, -3f, -3f, -1f,  0f,
         0f,  0f, -1f, -1f, -1f,  0f,  0f,
      }
    );
  
  /**
   * Emprossingフィルタ行列。
   * Ref. Java - ImageFilter Simple - Java - Snipplr (Posted By whitetiger)
   *      http://snipplr.com/view.php?codeview&id=1584
   */
  private static final Kernel EMBROSSING_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        -2f,  0f,  0f,
         0f,  1f,  0f,
         0f,  0f,  2f,
      }
    );
  
  /**
   * エッジ抽出フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 119ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel EDGE_TYPE1_FILTER_MATRIX =
    new Kernel(
      2, 2,
      new float[] {
        1f,  0f,
        0f, -1f,
      }
    );
  
  /**
   * エッジ抽出フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 119ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel EDGE_TYPE2_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
         0f,  0f,  0f,
        -1f,  0f,  1f,
         0f,  0f,  0f,
      }
    );
  
  /**
   * エッジ抽出フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 119ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel EDGE_TYPE3_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        -1f,  0f,  1f,
        -1f,  0f,  1f,
        -1f,  0f,  1f,
      }
    );
  
  /**
   * エッジ抽出フィルタ行列。
   * Ref. 図解雑学 デジタル画像処理 (山田 宏尚 著) 119ページ
   *      http://www.amazon.co.jp/exec/obidos/ASIN/4816342354/nilabz3-22/ref=nosim/
   */
  private static final Kernel EDGE_TYPE4_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        -1f,  0f,  1f,
        -2f,  0f,  2f,
        -1f,  0f,  1f,
      }
    );
 
  /**
   * エッジ抽出フィルタ行列。
   * Ref. Java - EdgeW / EdgeH (by whitetiger)
   *      http://snippets.dzone.com/posts/show/2965
   */
  private static final Kernel EDGE_TYPE5_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        -1f, -2f, -1f,
         0f,  0f,  0f,
         1f,  2f,  1f,
      }
    );
  
  /**
   * 膨張フィルタ行列。
   * Ref. Java - Dilate3 (by whitetiger)
   *      http://snippets.dzone.com/posts/show/2968
   */
  private static final Kernel DILATION_FILTER_MATRIX =
    new Kernel(
      3, 3,
      new float[] {
        1f, 1f, 1f,
        1f, 1f, 1f,
        1f, 1f, 1f,
      }
    );
  
  /**
   * 侵食フィルタ行列。
   * Ref. Java - Erode (by whitetiger)
   *      http://snippets.dzone.com/posts/show/2974
   */
  private static final Kernel EROSION_FILTER_MATRIX =
    new Kernel(
      7, 7,
      new float[] {
        0f, 0f, 0f, 0f, 0f, 0f, 0f,
        0f, 1f, 1f, 1f, 1f, 1f, 0f,
        0f, 1f, 1f, 1f, 1f, 1f, 0f,
        0f, 1f, 1f, 1f, 1f, 1f, 0f,
        0f, 1f, 1f, 1f, 1f, 1f, 0f,
        0f, 1f, 1f, 1f, 1f, 1f, 0f,
        0f, 0f, 0f, 0f, 0f, 0f, 0f,
      }
    );
  
  /**
   * 明るさ調整フィルタ行列。
   * Ref. Java - Brightness (by whitetiger)
   *      http://snippets.dzone.com/posts/show/2961
   */
  private static final Kernel getBrightnessFilterMatrix(float value){
    return new Kernel(1, 1, new float[]{value});
  }
  
}

参考

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)