0

我是 java 和 imageJ 的新手。我已经加载了一个图像并获得了一个名为imgproc的 ImageProcessor 。我在图像中找到了围绕特征的边界/框。外面只是背景。我还找到了这个区域的像素矩阵。现在我试图只处理图像中的这个区域。并且要使用以前的现有代码(方法)来做到这一点,我的输入参数应该是一个 ImageProcessor。所以,我最初的想法是使用 duplicate() 方法来制作imgproc的副本。并使用 resize 方法将其缩小到我之前找到的框的大小。但这不起作用,因为我使用显示图像方法进行了测试,所以我必须显示它。我得到的只是一张缩小的黑色图片。这个最初的想法编码在这里:

ImageProcessor Whiteimproc=imgproc.duplicate();
ImageProcessor BWhiteimproc=Whiteimproc.resize(BWhiteMatrix.length,BWhiteMatrix[0].length);
BWhiteimproc.setIntArray(BWhiteMatrix);
//the next three lines are going to show the image
Image ImagetoShow=BWhiteimproc.createImage();
Img ShowImg= new Img();
ShowImg.imgFrame(ImagetoShow,"BWhite");`

然后我尝试使用 ImagePlus 并创建一个新的 ImageProcessor。它奏效了。如下所示:

ImagePlus imgWhite=IJ.createImage("white","jpg",BWhiteMatrix.length,BWhiteMatrix[0].length,1);
ImageProcessor BWhiteimproc=imgWhite.getProcessor();
BWhiteimproc.setIntArray(BWhiteMatrix);
//the next three lines are going to show the image
Image ImagetoShow=BWhiteimproc.createImage();
Img ShowImg= new Img();
ShowImg.imgFrame(ImagetoShow,"BWhite");

有人能帮我解决为什么吗?而且我知道为什么我不能使用 ImageProcessor 来定义 ImageProcessor 类的新对象。

谢谢

4

1 回答 1

1

我不确定,但第一种方法可能不起作用,因为 ImageProcessor 的类型与第二种方法中的不同。尝试使用 . 检查 ImageProcessors 的运行时类型BWhiteimproc.getClass().getName()

ImageProcessor#setIntArray(int[][])对不同类型的图像做不同的事情。对于它调用的 32 位图像,Float.intBitsToFloat(int)如果 int 值为 100,则保存的浮点值将为 +0e100(浮点的最后 8 位是指数),即为零。对于 8 位和 16 位图像,它将 int 转换为不太精确的类型(字节和短)。

而且我知道为什么我不能使用 ImageProcessor 来定义 ImageProcessor 类的新对象。

ImageProcessor 是一个抽象类。您不能创建抽象类的实例。请改用其中一个子类:

  • 用于 8 位灰度图像的 ByteProcessor
  • 用于 16 位灰度图像的 ShortProcessor
  • 用于 32 位浮点灰度图像的 FloatProcessor
  • 用于 RGB 图像的 ColorProcessor
于 2013-07-31T09:06:28.417 回答