ImageJ apiを使用して、いくつかの画像を並べて配置した合成画像を保存しようとしています。
ImagePlusオブジェクトをロードして保存するコードがあります。しかし、ある画像を別の画像に貼り付ける方法がわかりません。
私はこの問題を、複数の画像を撮り、それらを並べてつなぎ合わせて、画像の寸法が異なる可能性のある大きな画像を形成することと解釈しています。次の不完全なコードはそれを行う1つの方法であり、開始する必要があります。
public ImagePlus composeImages(ArrayList<ImagePlus> imageList){
int sumWidth = 0;
int maxHeight = 0;
for(ImagePlus imp : imageList){
sumWidth = sumWidth +imp.getWidth();
if(imp.getHeight() > maxHeight)
maxHeight = imp.getWidth();
}
ImagePlus impComposite = new ImagePlus();
ImageProcessor ipComposite = new ShortProcessor(sumWidth, maxHeight);
for(int i=0; i<sumWidth; i++){
for(int j=0; j<sumWidth; j++){
ipComposite.putPixelValue(i, j, figureOutThis);
}
}
impComposite.setProcessor(ipComposite);
return impComposite;
}
figureOutThis
、で合成画像に入れるピクセル値()をi
見つけるアルゴリズムを作成する必要がありますj
。すべての画像の幅が同じで、それ以外の場合はもう少し作業が多い場合、これは非常に簡単です。ハッピーコーディング
編集:私はそれらもすべて短い画像であると仮定していることを追加する必要があります(私は医療用グレースケールで作業しています)。他のプロセッサ用にこれを変更できます
このコードは、画像のグリッドを結合/ステッチします。
画像はすべて同じ寸法であると想定しています。
ImagePlus combine(List<List<ImagePlus>> imagesGrid) {
checkArgument(
!imagesGrid.isEmpty() && !imagesGrid.get(0).isEmpty(), "Expected grid to be non-empty");
checkArgument(
imagesGrid.stream().map(List::size).distinct().count() == 1,
"Expected all rows in the grid to be of the same size");
checkArgument(
imagesGrid.stream().flatMap(List::stream).map(ImagePlus::getWidth).distinct().count() == 1,
"Expected all images to have the same width");
checkArgument(
imagesGrid.stream().flatMap(List::stream).map(ImagePlus::getHeight).distinct().count() == 1,
"Expected all images to have the same height");
int rows = imagesGrid.size();
int cols = imagesGrid.get(0).size();
int singleWidth = imagesGrid.get(0).get(0).getWidth();
int singleHeight = imagesGrid.get(0).get(0).getHeight();
int combinedWidth = singleWidth * cols;
int combinedHeight = singleHeight * rows;
ImageProcessor processor = new ColorProcessor(combinedWidth, combinedHeight);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
ImagePlus image = imagesGrid.get(row).get(col);
int offSetWidth = col * singleWidth;
int offsetHeight = row * singleHeight;
for (int w = 0; w < singleWidth; w++) {
for (int h = 0; h < singleHeight; h++) {
processor.putPixel(w + offSetWidth, h + offsetHeight, image.getPixel(w, h));
}
}
}
}
ImagePlus combinedImage = new ImagePlus();
combinedImage.setProcessor(processor);
return combinedImage;
}