Javaでの画像の操作
1. 概要
このチュートリアルでは、利用可能ないくつかの画像処理ライブラリを確認し、画像を読み込んでその上に図形を描画するという簡単な画像処理操作を実行します。
AWT(および少しのSwing)ライブラリ、ImageJ、OpenIMAJ、およびTwelveMonkeysを試してみます。
2. AWT
AWTは組み込みのJavaライブラリであり、ウィンドウの作成、ボタンやリスナーの定義など、表示に関連する簡単な操作をユーザーが実行できるようにします。 また、ユーザーが画像を編集できるようにするメソッドも含まれています。 Javaに同梱されているため、インストールは不要です。
2.1. 画像の読み込み
まず、ディスクドライブに保存されている画像からBufferedImageオブジェクトを作成します。
String imagePath = "path/to/your/image.jpg";
BufferedImage myPicture = ImageIO.read(new File(imagePath));
2.2. 画像の編集
画像に図形を描くには、読み込んだ画像に関連するGraphicsオブジェクトを使用する必要があります。 Graphics オブジェクトは、基本的なレンダリング操作を実行するために必要なプロパティをカプセル化します。 Graphics2D は、Graphicsを拡張するクラスです。 2次元形状をより細かく制御できます。
この特定のケースでは、形状の幅を拡張してはっきりと見えるようにするために、Graphic2Dが必要です。 そのstrokeプロパティを増やすことでそれを実現します。 次に、色を設定し、画像の境界から10ピクセルの形状になるように長方形を描画します。
Graphics2D g = (Graphics2D) myPicture.getGraphics();
g.setStroke(new BasicStroke(3));
g.setColor(Color.BLUE);
g.drawRect(10, 10, myPicture.getWidth() - 20, myPicture.getHeight() - 20);
2.3. 画像の表示
画像に何かを描いたので、それを表示したいと思います。 Swingライブラリオブジェクトを使用してこれを行うことができます。 まず、テキストや画像の表示領域を表すJLabelオブジェクトを作成します。
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
次に、JLabelをJPanelに追加します。これは、JavaベースのGUIの
として扱うことができます。
JPanel jPanel = new JPanel();
jPanel.add(picLabel);
最後に、画面に表示されるウィンドウであるJFrameにすべてを追加します。 プログラムを実行するたびにこのウィンドウを展開する必要がないように、サイズを設定する必要があります。
JFrame f = new JFrame();
f.setSize(new Dimension(myPicture.getWidth(), myPicture.getHeight()));
f.add(jPanel);
f.setVisible(true);
3. ImageJ
ImageJは、画像を操作するために作成されたJavaベースのソフトウェアです。 かなりの数のプラグインがあり、ここで入手できます。 自分で処理したいので、APIのみを使用します。
作成目的がGUI操作ではなく画像処理であったため、SwingやAWTよりも優れた非常に強力なライブラリです。 プラグインには、自由に使用できるアルゴリズムが多数含まれています。これは、IPアルゴリズムに基づく数学や最適化の問題を解決するのではなく、画像処理を学び、結果をすばやく確認したい場合に便利です。
3.1. Mavenの依存関係
ImageJの操作を開始するには、プロジェクトのpom.xmlファイルに依存関係を追加するだけです。
<dependency>
<groupId>net.imagej</groupId>
<artifactId>ij</artifactId>
<version>1.51h</version>
</dependency>
最新バージョンはMavenリポジトリにあります。
3.2. 画像の読み込み
画像を読み込むには、 IJクラスのopenImage()staticメソッドを使用する必要があります。
ImagePlus imp = IJ.openImage("path/to/your/image.jpg");
3.3. 画像の編集
画像を編集するには、ImagePlusオブジェクトにアタッチされたImageProcessorオブジェクトのメソッドを使用する必要があります。 AWTのGraphicsオブジェクトについて考えてみてください。
ImageProcessor ip = imp.getProcessor();
ip.setColor(Color.BLUE);
ip.setLineWidth(4);
ip.drawRect(10, 10, imp.getWidth() - 20, imp.getHeight() - 20);
3.4. 画像の表示
ImagePlusオブジェクトのshow()メソッドを呼び出すだけです。
imp.show();
4. OpenIMAJ
OpenIMAJは、コンピュータービジョンとビデオ処理だけでなく、機械学習、オーディオ処理、Hadoopとの連携などに焦点を当てたJavaライブラリのセットです。 OpenIMAJプロジェクトのすべての部分は、ここの「モジュール」の下にあります。 画像処理部分だけが必要です。
4.1. Mavenの依存関係
OpenIMAJの使用を開始するには、プロジェクトのpom.xmlファイルに依存関係を追加するだけです。
<dependency>
<groupId>org.openimaj</groupId>
<artifactId>core-image</artifactId>
<version>1.3.5</version>
</dependency>
最新リリースはここにあります。
4.1. 画像の読み込み
画像を読み込むには、 ImageUtilities.readMBF()メソッドを使用します。
MBFImage image = ImageUtilities.readMBF(new File("path/to/your/image.jpg"));
MBFはマルチバンド浮動小数点画像の略です(この例ではRGBですが、色を表す唯一の方法ではありません)。
4.2. 画像の編集
長方形を描画するには、4つのポイント(左上、左下、右下、右上)で構成されるポリゴンである形状を定義する必要があります。
Point2d tl = new Point2dImpl(10, 10);
Point2d bl = new Point2dImpl(10, image.getHeight() - 10);
Point2d br = new Point2dImpl(image.getWidth() - 10, image.getHeight() - 10);
Point2d tr = new Point2dImpl(image.getWidth() - 10, 10);
Polygon polygon = new Polygon(Arrays.asList(tl, bl, br, tr));
お気づきかもしれませんが、画像処理ではY軸が逆になります。 形状を定義したら、それを描画する必要があります。
image.drawPolygon(polygon, 4, new Float[] { 0f, 0f, 255.0f });
描画方法は、 Float 配列で表される形状、線の太さ、RGBチャネル値の3つの引数を取ります。
4.3. 画像の表示
DisplayUtilities を使用する必要があります:
DisplayUtilities.display(image);
5. TwelveMonkeys ImageIO
TwelveMonkeys ImageIO ライブラリは、Java ImageIO APIの拡張として意図されており、より多くのフォーマットをサポートしています。
ほとんどの場合、コードは組み込みのJavaコードと同じように見えますが、必要な依存関係を追加した後、追加の画像形式で機能します。
デフォルトでは、Javaは画像に対して次の5つの形式のみをサポートします: JPEG 、 PNG 、 BMP 、 WEBMP 、
別の形式の画像ファイルを操作しようとすると、アプリケーションはそれを読み取ることができず、BufferedImage変数にアクセスするときにNullPointerExceptionをスローします。
TwelveMonkeys は、次の形式のサポートを追加します: PNM 、 PSD 、 TIFF 、 HDR 、 IFF 、 PCX 、 PICT 、 SGI 、 TGA 、 ICNS 、
特定の形式の画像を操作するには、imageio-jpegやimageio-tiffなどの対応する依存関係を追加する必要があります。
依存関係の完全なリストは、TwelveMonkeysドキュメントにあります。
.ico画像を読み取る例を作成しましょう。 コードはAWTセクションと同じように見えますが、別の画像を開く点が異なります。
String imagePath = "path/to/your/image.ico";
BufferedImage myPicture = ImageIO.read(new File(imagePath));
この例を機能させるには、imageio-bmp依存関係である.icoイメージのサポートを含むTwelveMonkeys依存関係を追加する必要があります。 imageio-core 依存関係:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-bmp</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.3.2</version>
</dependency>
そして、これがすべてです! 組み込みのImageIOJavaAPIは、実行時にプラグインを自動的にロードします。これで、プロジェクトは.icoイメージでも機能します。
6. 概要
画像の操作に役立つ4つのライブラリを紹介しました。 さらに進んで、エッジの抽出、コントラストの強化、フィルターや顔検出の使用など、いくつかの画像処理アルゴリズムを探すこともできます。
これらの目的のために、ImageJまたはOpenIMAJの学習を開始する方が良いかもしれません。 どちらもプロジェクトに含めるのは簡単で、画像処理に関してはAWTよりもはるかに強力です。
これらの画像処理の例は、GitHubプロジェクトにあります。