画像処理用のオープンソース Java ライブラリ
無料の Java API を使用して、新しい画像の作成、既存の画像の変更、スパース データの操作、既存の画像の複製を行う汎用の多次元画像処理 API。
オープン ソースの ImgLib2 ライブラリを使用すると、ソフトウェア開発者は Java アプリ内でイメージを作成および操作できます。このライブラリは、ユーザーが独自のアプリケーション内で数値および非数値データ型を簡単に使用できるようにするインターフェイス主導の設計を提供します。
ImgLib2 は、新しい画像の作成、既存の画像の変更、既存の画像のオープンと読み取り、スパース データの操作、既存の画像の複製、汎用など、画像処理に関連するいくつかの重要な機能をサポートする汎用の多次元画像処理ライブラリです。画像データのコピー、球体の描画、補間のサポートなど。
ライブラリは非常に使いやすく、不必要な複雑さを回避するため、開発者はプロジェクトの開発中にアルゴリズムの本質に集中できます。ライブラリの優れた点は、次元に依存せず、ユーザーが多次元データに適用できる方法でコードを表現できることです。ライブラリの機能は画像だけにとどまらず、RNA シーケンスで機能する例もあります。
ImgLib2 を使ってみる
ImgLib2 をインストールする最も簡単で推奨される方法は、GitHub を使用することです。
GitHub経由でImgLib2をインストール
go get -u github.com/imglib/imglib2.git
Java による新しい画像の作成
オープン ソースの Java ライブラリ ImgLib2 には、数行の Java コードだけで新しいイメージをゼロから作成するためのサポートが含まれています。 ImgLib2 ライブラリを使用すると、単純な画像、3D 画像、ImgFactory など、さまざまな種類の画像を作成できます。ほんの数行のコードで、既存の画像の画像を変更することもできます。
Java API を介して新しい画像を作成する
public Example1c()
{
// create the ImgFactory based on cells (cellsize = 5x5x5...x5) that will
// instantiate the Img
final ImgFactory< FloatType > imgFactory = new CellImgFactory<>( new FloatType(), 5 );
// create an 3d-Img with dimensions 20x30x40 (here cellsize is 5x5x5)Ø
final Img< FloatType > img1 = imgFactory.create( 20, 30, 40 );
// create another image with the same size. Note that the input provides the size for the new image as it implements the Interval interface
final Img< FloatType > img2 = imgFactory.create( img1 );
// display both (but they are empty)
ImageJFunctions.show( img1 );
ImageJFunctions.show( img2 );
}
Java API による画像複製
ImgLib2 ライブラリには、Java コマンドを使用して画像を複製する機能が含まれています。既存のイメージのコピーを簡単に作成できます。カーソルを使用してこのタスクを達成できます。また、ジェネリック メソッドである copy メソッドを使用することもできます。素晴らしいことは、どの種類のタイプでも機能することです。
重複した画像はJava API
public DuplicateImage() throws ImgIOException
{
// open with SCIFIO as a FloatType
Img< FloatType > img = IO.openImgs( "DrosophilaWing.tif", new FloatType() ).get( 0 );
// copy the image, as it is a generic method it also works with FloatType
Img< FloatType > duplicate = copyImage( img );
// display the copy
ImageJFunctions.show( duplicate );
}
// Generic, type-agnostic method to create an identical copy of an Img
public < T extends Type< T > > Img< T > copyImage( final Img< T > input )
{
// create a new Image with the same properties
Img< T > output = input.factory().create( input );
// create a cursor for both images
Cursor< T > cursorInput = input.cursor();
Cursor< T > cursorOutput = output.cursor();
// iterate over the input
while ( cursorInput.hasNext())
{
// move both cursors forward by one pixel
cursorInput.fwd();
cursorOutput.fwd();
// set the value of this pixel of the output image to the same as the input,
// every Type supports T.set( T type )
cursorOutput.get().set( cursorInput.get() );
}
// return the copy
return output;
}
部分的に Java を介して画像を表示する
無料の ImgLib2 ライブラリを使用すると、ソフトウェア開発者は、数行の Java コードを介してアプリ内の画像の一部のみを表示できます。ビューは非常に強力で、イメージの選択した部分を表示したり、回転したビューを表示したり、その他いくつかのことを行うために使用できます。ビューは RandomAccessible、Interval にすることができるため、Iterable にすることができます。
スパース データ管理
無料の ImgLib2 ライブラリを使用すると、ソフトウェア開発者は Java コードを使用してスパース データを操作できます。ライブラリには、スパース データを表示するための 2 つの補間スキームが用意されています。ユーザーは、最も近いサンプルの値、またはサンプリングされた位置に k 個の最近傍の補間された距離加重値のいずれかを返すことにより、空間内のすべての位置の値を計算できます。
Javaアプリ内のスパースデータを扱う
// Working with sparse data
public SparseExample()
{
// the interval in which to create random points
FinalInterval interval = new FinalInterval( new long[] { 375, 200 } );
// create an IterableRealInterval
IterableRealInterval< FloatType > realInterval = createRandomPoints( interval, 250 );
// using nearest neighbor search we will be able to return a value an any position in space
NearestNeighborSearch< FloatType > search =
new NearestNeighborSearchOnKDTree<>(
new KDTree<>( realInterval ) );
// make it into RealRandomAccessible using nearest neighbor search
RealRandomAccessible< FloatType > realRandomAccessible =
Views.interpolate( search, new NearestNeighborSearchInterpolatorFactory< FloatType >() );
// convert it into a RandomAccessible which can be displayed
RandomAccessible< FloatType > randomAccessible = Views.raster( realRandomAccessible );
// set the initial interval as area to view
RandomAccessibleInterval< FloatType > view = Views.interval( randomAccessible, interval );
// display the view
ImageJFunctions.show( view );
// compute a gauss on it
Img< FloatType > convolved = new ArrayImgFactory<>( new FloatType() ).create( interval );
Gauss.inFloat( new double[] { 3, 3 }, view, interval, convolved,
new Point( view.numDimensions() ), convolved.factory() );
// display the view
ImageJFunctions.show( convolved );
}