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

を拡張したクラスです。それは二次元形状に対するより多くの制御を提供する。

この特定のケースでは、明確に見えるようにするために図形の幅を広げるために

Graphic2D

が必要です。我々はそのs

__troke

__プロパティを増やすことによってそれを達成します。次に色を設定し、形状が画像の境界から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ライブラリオブジェクトを使ってそれを行うことができます。まず、textやimageの表示領域を表す

JLabel

オブジェクトを作成します。

JLabel picLabel = new JLabel(new ImageIcon(myPicture));

それから

JLabel



JPanel

に追加します。これは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ベースのソフトウェアです。かなりたくさんのプラグインがあり、https://imagej.nih.gov/ij/plugins/[こちら]から入手できます。私たちは自分自身で処理を実行したいので、私たちはAPIのみを使用します。

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


3.1. Mavenの依存関係

ImageJを使い始めるには、プロジェクトの

pom.xml

ファイルに依存関係を追加するだけです。

<dependency>
    <groupId>net.imagej</groupId>
    <artifactId>ij</artifactId>
    <version>1.51h</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22net.imagej%22%20AND%20a%3A%22ij%22[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プロジェクトのすべての部分はhttp://openimaj.org/[ここ]の「モジュール」の下にあります。画像処理部分だけが必要です。


4.1. Mavenの依存関係

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

<dependency>
    <groupId>org.openimaj</groupId>
    <artifactId>core-image</artifactId>
    <version>1.3.5</version>
</dependency>

最新のリリースhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.openimaj%22%20AND%20a%3A%22core-image%22[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 });

描画メソッドは3つの引数を取ります:形状、線の太さ、

Float

arrayで表されるRGBチャンネルの値です。


4.3. 画像を表示する


DisplayUtilities

を使用する必要があります。

DisplayUtilities.display(image);


5

TwelveMonkeys


ImageIO



TwelveMonkeys


ImageIO

ライブラリは、Java

ImageIO

APIの拡張機能として、より多くの形式をサポートすることを目的としています。

ほとんどの場合、コードは組み込みのJavaコードと同じように見えますが、必要な依存関係を追加すると、追加のイメージフォーマットで機能します。

デフォルトでは、Javaは

JPEG



PNG



BMP



WEBMP



GIF

の5つの形式の画像のみをサポートします。

別の形式の画像ファイルを処理しようとすると、アプリケーションはそれを読み取れず、

BufferedImage

変数にアクセスするときに

NullPointerException

がスローされます。


TwelveMonkeys

は、次のフォーマットのサポートを追加します。

  • 特定のフォーマットの画像を扱うには、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22imageio-jpeg%22%など、対応する依存関係を追加する必要があります。 20AND%20g%3A%22com.twelvemonkeys.imageio%22[imageio-jpeg]またはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22imageio-tiff%22%20AND% 20g%3A%22com.twelvemonkeys.imageio%22[imageio-tiff]

依存関係の完全なリストはhttps://github.com/haraldk/TwelveMonkeys[TwelveMonkeys]ドキュメントにあります。


.ico

画像を読み取る例を作成しましょう。コードは

AWT

セクションと同じように見えますが、異なる画像を開きます。

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

この例が機能するためには、

.ico

imagesのサポートを含む

TwelveMonkeys

依存関係を追加する必要があります。これはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22imageio-です。

https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%と共にbmp%22%20AND

20%%3%22com.twelvemonkeys.imageio%22[imageio-bmp]依存関係22imageio-core%22%20AND%20g%3A%22com.twelvemonkeys.imageio%22[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>

そしてこれがすべてです! ** 組み込みの

ImageIO

Java APIは、実行時に自動的にプラグインをロードします。


6. 概要

あなたはあなたが画像を扱うのを助けることができる4つのライブラリに紹介されました。さらに進むと、エッジの抽出、コントラストの強化、フィルタの使用、顔検出など、いくつかの画像処理アルゴリズムを探すことができます。

そのためには、ImageJまたはOpenIMAJの学習を始めることをお勧めします。どちらもプロジェクトに含めるのは簡単で、画像処理に関してはAWTよりはるかに強力です。

これらの画像処理の例はhttps://github.com/eugenp/tutorials/tree/master/image-processing[GitHubプロジェクト]にあります。