经过几个小时的搜索,我依靠你的专业知识!请帮忙!
基本上,我正在尝试从灰度图像中的单个像素访问数据。
这是我正在谈论的图像的链接: - 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并更改了所有像素的亮度因子,然后再次将它们相乘,但它只是使图像无法识别。我真的很困惑如何消除噪音!
我期待着阅读你的回复。
答案 0 :(得分:2)
这在很大程度上取决于您要移除的噪音类型。如果您遇到一些相邻像素比设置区域中的大多数像素亮得多的情况,您通常会使用简单的内核进行某种类型的2D过滤。
我们遗漏了您的一些信息,例如噪音类型。因此,我将尽可能利用有限的信息尽力而为。
首先,什么构成“太亮”? “太亮”只是在强度上比相邻像素高几个标准偏差,还是基本上是黑白的像素?
在后一种情况下,它是盐 - 胡椒/脉冲噪音去除。
你基本上做一个3x3空间滤镜,并选择模式或中值。瞧,不再是过于明亮的像素。但是,这会有效地模糊您的图像,因此您可能会考虑使用自适应滤波,因此您只需修改像素,而不是修改所有像素。
最后,我们必须考虑您只是想根据某些统计值删除比周围像素更亮的像素,而不是仅仅是潜在极端异常值的像素(即:脉冲/椒盐噪声)。这个最终方法在CPU时间方面非常昂贵,但可以让你处理局部极值。
http://www.mathsisfun.com/data/standard-deviation.html
如果您要将此统计方法与自适应滤波技术相结合(即:检测哪些像素需要修改,而不是盲目修改所有可用像素),您可以删除问题像素,而不会影响整体图像质量明显的金额。
最后,您还应该考虑在图像处理方面查看LaPlace运算符。它可以作为一个简单的边缘探测器,也可能引导您朝着正确的方向前进。
祝你好运!答案 1 :(得分:0)
如果您只想比较两个像素的亮度,可能需要使用HSV color model,其中V代表值(基本上是亮度)。您可以使用相对简单的算法在RGB和HSV之间convert。根据第二个链接,java.awt.Color
包已经内置了这些算法。