シャープネス/ぼかしはConvolveOpを使う
SharpenBlurPlugInはシャープネス/ぼかしのフィルターです。選択されている部分がぼかしを、その上の領域がシャープネスを処理した状態です。 |
例えば、ある地点の周辺というのは8個のドットからなります(3×3の中心のドットを想像してください)。自身を含めて9個のドットがあるわけです。その9個のドットの輝度を合計し、9で割った値を新しい輝度として設定したらどうなるでしょうか? それは「周辺ドットの輝度の平均的な値」に変更されることになります。ということは? そう、少しだけ「ぼかし」が入った感じになるのです。
逆に、その地点の輝度を大きく増やし、周辺の輝度をマイナス値として差し引くようにしたらどうなるでしょうか? 今度は、周辺が暗くその地点が明るいような状況になるほどより輝度が高く設定されることになります。つまり「シャープネス」の処理がされた状態になるわけです。
こうした処理を行うためには、すべてのドットについて、その周辺のドットの状態を調べなければいけません。これは、手作業でやるのはかなり大変そうですね。そこで、こうした処理を行うためのクラスとして用意されているのが「java.awt.image.ConvolveOp」というものです。これは「カーネル(java.awt.image.Kernel)」と呼ばれるものを使い輝度の変換処理を行うためのクラスです。カーネルは、一定範囲のドットの輝度に乗算する係数を配列としてまとめたものをもっており、これを使ってConvolveOpはマトリックス演算を行うわけです。
[Kernel] = new Kernel(配列の幅,配列の縦数,float配列);
[ConvolveOp] = new ConvolveOp([Kernel]);
[ConvolveOp].filter([BufferedImage1],[BufferedImage2]);
ConvolveOpの基本的な使い方を整理するとこのようになります。マトリックス演算のための、各ドットに乗算する係数をまとめたfloat配列さえきちんと作ることができれば、後はそれほど難しくはありません。では、実際にConvolveOpを使った「SharpenBlurPlugIn」というプラグインを作成してみましょう。
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import jp.tuyano.FreeCapturePlugIn;
public class SharpenBlurPlugIn implements FreeCapturePlugIn{
public BufferedImage doPlugin(BufferedImage img,Frame frame) {
if (img == null) return null;
Kernel kernel;
String[] list = {"more Sharpness","Sharpness","Blur","more Blur"};
String res = (String)JOptionPane.showInputDialog(frame,
"利用するフィルターを選んでください。","設定",
JOptionPane.QUESTION_MESSAGE,null,list,list[0]);
if (res.equals("more Sharpness")){
float f0 = - 0.5f;
float f1 = -1.0f;
float f2 = 17.0f;
float[] matrix = {
f0,f0,f0,f0,f0,
f0,f1,f1,f1,f0,
f0,f1,f2,f1,f0,
f0,f1,f1,f1,f0,
f0,f0,f0,f0,f0};
kernel = new Kernel(5,5,matrix);
} else if(res.equals("Sharpness")){
float f0 = - 0.1f;
float f1 = -0.3f;
float f2 = 5.0f;
float[] matrix = {
f0,f0,f0,f0,f0,
f0,f1,f1,f1,f0,
f0,f1,f2,f1,f0,
f0,f1,f1,f1,f0,
f0,f0,f0,f0,f0};
kernel = new Kernel(5,5,matrix);
} else if(res.equals("Blur")){
float f0 = 1f / 9f;
float[] matrix = {
f0,f0,f0,
f0,f0,f0,
f0,f0,f0};
kernel = new Kernel(3,3,matrix);
} else {
float f0 = 1f / 25f;
float[] matrix = {
f0,f0,f0,f0,f0,
f0,f0,f0,f0,f0,
f0,f0,f0,f0,f0,
f0,f0,f0,f0,f0,
f0,f0,f0,f0,f0};
kernel = new Kernel(5,5,matrix);
}
ConvolveOp co = new ConvolveOp(kernel);
BufferedImage img2 = new BufferedImage(img.getWidth(),
img.getHeight(),img.getType());
Graphics g = img2.getGraphics();
g.drawImage(img,0,0,null);
g.dispose();
co.filter(img,img2);
return img2;
}
public String getName() {
return "シャープネス/ぼかし...";
}
}
※MANIFEST.MF
Manifest-Version: 1.0
Plugin-Class: SharpenBlurPlugIn