如何使用ImageJ-Plugin水平翻转图像?

时间:2012-04-30 10:59:10

标签: java imagej

我想为ImageJ开发一个水平翻转图像的Java插件。 但是我的代码翻了一半。也许,图像副本的构造或输出有问题?

public class flipHorizontal implements PlugInFilter {

public int setup (String arg, ImagePlus imp)
{
    return DOES_ALL;
}

public void run (ImageProcessor ip)
{
    int height=ip.getHeight();
    int width=ip.getWidth();

    ImageProcessor copy = ip;


    for (int x=0; x<width; x++) {

        for (int y=0; y<height; y++) {
            int p=ip.getPixel(width-x-1,y);
            copy.putPixel(x,y,p);
        }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

你的逻辑错了。你得到的是正常的:你没有处理你图像的一半,而是在你的图像的一半水平翻转,另一半翻了一半(如果我没弄错的话)。

无论如何,如果你想通过自己直接操纵像素来水平翻转,就像你的代码示例一样,那么你需要去宽度的一半(宽度),而不是去 width 。 / 2 的)。

然后你需要实际反转“左”和“右”的两个像素

这是一个有效的水平翻转:

    for (int x = 0; x < w / 2; x++) {
        for (int y = 0; y < h; y++) {
            final int l = tmp.getRGB( w - (x + 1), y);
            final int r = tmp.getRGB( x, y);
            tmp.setRGB( x, y, l );
            tmp.setRGB( w - (x + 1), y, r );
        }
    }

上面的代码中可能存在“off-by-one”错误,但您应该明白这一点。

答案 1 :(得分:0)

TacticalCoder是正确的,您应该只在图像的一半处迭代,并且需要在覆盖之前保存另一侧的值。

还有两点值得一提,但有一点是ImageProcessor class已经有一个名为flipHorizontal的方法,因此您可以将代码简化为:

public class flipHorizontal implements PlugInFilter {

    public int setup (String arg, ImagePlus imp) {
        return DOES_ALL;
    }

    public void run (ImageProcessor ip) {
        ip.flipHorizontal();
    }
}

值得做的另一点是,你似乎误解了这条线的含义:

ImageProcessor copy = ip;

这只是创建了与ip相同的对象的另一个引用,所以:

copy.putPixel(x,y,p);

......和:

ip.putPixel(x,y,p);

......具有完全相同的效果。如果要创建表示相同像素数据的新ImageProcessor,可以执行以下操作:

ImageProcessor copy = ip.duplicate();

但是,在这种情况下,这不是必需的。