フィルター行列をあらわす Kernel クラスとその処理を行う ConvolveOp クラスでいろいろと画像処理することが可能。
カラー画像をいろいろと加工した結果
Pink on Flickr - Photo Sharing! (by owen-jp). の画像をいろいろと処理してみる。
元画像
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
白黒2値画像をいろいろと加工した結果
Pink on Flickr - Photo Sharing! (by owen-jp). を白黒2値画像にしたものをベースにいろいろと画像処理してみる。
元画像
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
ソースコード
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});
}
}
参考
- 山田 宏尚 著 / 図解雑学 デジタル画像処理
- CodeZine:Javaにおけるイメージのフィルタ処理(グラフィック, java)
- Image Sharpening with a Laplacian Kernel
- "The Image Processing Handbook" by John C. Russ
- Java - ImageFilter Simple - Java - Snipplr (Posted By whitetiger)
- Java - EdgeW / EdgeH (by whitetiger)
- Java - Dilate3 (by whitetiger)
- Java - Erode (by whitetiger)
- Java - Brightness (by whitetiger)
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)