Javaプログラミング/Javaプログラミング関連情報

画面キャプチャーを作ろう(4)(3ページ目)

前回作成したプラグイン機能を使ってさまざまなフィルターを作ってみましょう。

執筆者:掌田 津耶乃

シャープネス/ぼかしは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

  • 前のページへ
  • 1
  • 2
  • 3
  • 4
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます