Javaで画像を扱う

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));

次に、JLabelJPanelに追加します。これは、JavaベースのGUIの<div></div>として扱うことができます。

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ベースのソフトウェアです。 非常に多くのプラグインがあり、hereを使用できます。 自分で処理を実行するため、APIのみを使用します。

作成の目的がGUI操作ではなく画像処理であったため、SwingやAWTよりも優れた非常に強力なライブラリです。 プラグインには多くの自由に使用できるアルゴリズムが含まれています。これは、IPアルゴリズムの下にある数学や最適化の問題を解決するのではなく、画像処理を学び、結果をすぐに見たい場合に便利です。

3.1. メーベン依存

ImageJの使用を開始するには、プロジェクトのpom.xmlファイルに依存関係を追加するだけです。


    net.imagej
    ij
    1.51h

最新バージョンはMaven repositoryにあります。

3.2. 画像の読み込み

イメージをロードするには、IJクラスのopenImage()静的メソッドを使用する必要があります。

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プロジェクトのすべての部分は、「モジュール」の下のhereにあります。画像処理部分だけが必要です。

4.1. メーベン依存

OpenIMAJの使用を開始するには、プロジェクトの pom.xml ファイルに依存関係を追加するだけです。


    org.openimaj
    core-image
    1.3.5

最新リリースhereが見つかります。

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. TwelveMonkeysImageIO

TwelveMonkeysImageIOライブラリは、JavaImageIO APIの拡張として意図されており、より多くの形式をサポートしています。

ほとんどの場合、コードは組み込みのJavaコードと同じように見えますが、必要な依存関係を追加した後、追加の画像形式で機能します。

デフォルトでは、Javaはイメージに対して次の5つの形式のみをサポートします:JPEGPNGBMPWEBMPGIF

別の形式の画像ファイルを操作しようとすると、アプリケーションはそれを読み取ることができず、BufferedImage変数にアクセスするときにNullPointerExceptionをスローします。

TwelveMonkeysは、次の形式のサポートを追加します:PNMPSDTIFFHDRIFFPCXPICTSGITGAICNSICOCURThumbs.dbSVGWMF

imageio-jpegimageio-tiffなどのTo work with images in a specific format, we need to add the corresponding dependency

依存関係の完全なリストは、TwelveMonkeysのドキュメントにあります。

.ico画像を読み取る例を作成しましょう。 別の画像を開くことを除いて、コードはAWTセクションと同じように見えます。

String imagePath = "path/to/your/image.ico";
BufferedImage myPicture = ImageIO.read(new File(imagePath));

この例を機能させるには、imageio-bmp依存関係である.icoイメージのサポートを含むTwelveMonkeys依存関係を、imageio-core依存関係とともに追加する必要があります。


    com.twelvemonkeys.imageio
    imageio-bmp
    3.3.2


    com.twelvemonkeys.imageio
    imageio-core
    3.3.2

そしてこれがすべてです! The built-in ImageIO Java API loads the plugins automatically at runtime.これで、プロジェクトは.ico画像でも機能します。

6. 概要

画像の操作に役立つ4つのライブラリが紹介されました。 さらに進むと、エッジの抽出、コントラストの強化、フィルターの使用、顔検出などの画像処理アルゴリズムを探したい場合があります。

これらの目的のために、ImageJまたはOpenIMAJの学習を開始した方がよい場合があります。 どちらもプロジェクトに簡単に組み込むことができ、画像処理に関してはAWTよりもはるかに強力です。

これらの画像処理の例は、the GitHub projectにあります。