两个像素之间的“亮度差异”

时间:2013-10-27 22:22:01

标签: java image-processing

经过几个小时的搜索,我依靠你的专业知识!请帮忙!

基本上,我正在尝试从灰度图像中的单个像素访问数据。

这是我正在谈论的图像的链接: - http://s14.postimg.org/ak092kza5/WORKS.jpg?noCache=1382913709(它应该全是黑色的。我知道我可以把它涂成颜色,但这不是我想要学习的东西 - 我想要找出我如何消除噪音!)

 public static void handlesinglepixel(int x, int y, int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        // Deal with the pixel as necessary...
    }

    public static void handlepixels(Image img, int x, int y, int w, int h) {
        int[] pixels = new int[w * h];
        PixelGrabber pg = new PixelGrabber(img, x, y, w, h, pixels, 0, w);
        try {
            pg.grabPixels();
        } catch (InterruptedException e) {
            System.err.println("interrupted waiting for pixels!");
            return;
        }
        if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
            System.err.println("image fetch aborted or errored");
            return;
        }
        for (int j = 0; j < h; j++) {
            for (int i = 0; i < w; i++) {
                handlesinglepixel(x + i, y + j, pixels[j * w + i]);
            }
        }
    }

所以使用这个我可以访问各个像素。我真的很开心!但是......我现在想要比较相邻像素,看看它们是否比其他像素异常亮。我这样做是因为我想从pic中删除噪音。有什么建议吗?

P.S我尝试使用RescaleOp并更改了所有像素的亮度因子,然后再次将它们相乘,但它只是使图像无法识别。我真的很困惑如何消除噪音!

我期待着阅读你的回复。

2 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您要移除的噪音类型。如果您遇到一些相邻像素比设置区域中的大多数像素亮得多的情况,您通常会使用简单的内核进行某种类型的2D过滤。

我们遗漏了您的一些信息,例如噪音类型。因此,我将尽可能利用有限的信息尽力而为。

首先,什么构成“太亮”? “太亮”只是在强度上比相邻像素高几个标准偏差,还是基本上是黑白的像素?

在后一种情况下,它是盐 - 胡椒/脉冲噪音去除。

你基本上做一个3x3空间滤镜,并选择模式或中值。瞧,不再是过于明亮的像素。但是,这会有效地模糊您的图像,因此您可能会考虑使用自适应滤波,因此您只需修改像素,而不是修改所有像素。

最后,我们必须考虑您只是想根据某些统计值删除比周围像素更亮的像素,而不是仅仅是潜在极端异常值的像素(即:脉冲/椒盐噪声)。这个最终方法在CPU时间方面非常昂贵,但可以让你处理局部极值。

  1. 对于NxN滤波器内核,计算内核重叠的所有像素的平均/平均强度值,即:E(X)。 (即:将每个像素除以N ^ 2,然后对它们求和,以避免溢出)
  2. 对于相同的NxN区域,计算标准偏差E(X ^ 2)。 (即:计算均值,然后计算每个像素,计算(pixel_intensity - mean_value)的绝对值,然后对其求平方。将所有这些差值求和,并除以N ^ 2.
  3. 循环遍历NxN区域中的所有像素。如果单个像素大于平均值以外的2.5个标准偏差,则将其强度降低固定百分比。
  4. http://www.mathsisfun.com/data/standard-deviation.html

    如果您要将此统计方法与自适应滤波技术相结合(即:检测哪些像素需要修改,而不是盲目修改所有可用像素),您可以删除问题像素,而不会影响整体图像质量明显的金额。

    最后,您还应该考虑在图像处理方面查看LaPlace运算符。它可以作为一个简单的边缘探测器,也可能引导您朝着正确的方向前进。

    http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

    祝你好运!

答案 1 :(得分:0)

如果您只想比较两个像素的亮度,可能需要使用HSV color model,其中V代表值(基本上是亮度)。您可以使用相对简单的算法在RGB和HSV之间convert。根据第二个链接,java.awt.Color包已经内置了这些算法。