ImageJ API:组合图像

时间:2012-09-03 16:36:02

标签: java imagej

使用ImageJ api,我正在尝试保存一个合成图像,由几个并排放置的图像组成。

我有代码加载ImagePlus objs并保存它们。但我无法想象如何将图像粘贴到另一个图像。

2 个答案:

答案 0 :(得分:1)

此代码组合/缝合图像网格:

假设所有图像的尺寸都相同。

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

答案 1 :(得分:0)

我将问题解释为拍摄多个图像并将它们并排拼接在一起形成一个大图像,其中图像可能具有不同的尺寸。以下不完整的代码是一种方法,应该让你开始。

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;

}

您需要编写一个算法来查找要放在figureOutThisi的合成图像中的像素值(j)。如果所有图像具有相同的宽度并且稍微更多的工作则这是非常微不足道的。快乐的编码

编辑: 我应该补充一点,我假设它们也都是短图像(我使用医学灰度)。您可以为其他处理器修改此内容