0

经过数小时的搜索,我依靠您的专业知识!请帮忙!

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

这是我正在谈论的图像的链接:- 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]);
            }
        }
    }

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

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

我期待着阅读您的回复。

4

2 回答 2

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 个标准偏差,则将其强度降低一个固定百分比。

http://www.mathsisfun.com/data/standard-deviation.html

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

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

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

祝你好运!

于 2013-10-27T22:30:46.593 回答
0

如果您只想比较两个像素的亮度,使用HSV 颜色模型可能是一个好主意,其中 V 代表值(基本上是亮度)。您可以使用相对简单的算法在 RGB 和 HSV 之间进行转换。根据第二个链接,该java.awt.Color软件包已经内置了这些算法。

于 2013-10-27T23:15:32.737 回答