java计算两个像素之间的“亮度差”
经过数小时的搜索,我相信你的专业知识!请帮忙
基本上,我试图从灰度图像中的单个像素访问数据
这里有一个链接指向我正在谈论的图像:-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]);
}
}
}
所以使用这个我可以访问单个像素。我真的很开心!但是我现在想比较一下相邻的像素,看看它们是否比另一个像素亮。我这样做是因为我想消除照片中的噪音。有什么建议吗
另外,我尝试使用“重新缩放”并更改了所有像素的亮度因子,然后再次将它们相乘,但这只会使图像无法识别。我真的被困在如何消除噪音的问题上了
我期待着阅读您的回复
# 1 楼答案
这在很大程度上取决于要消除的噪声类型。如果遇到一些相邻像素比设定区域中的大多数像素亮得多的情况,通常需要使用简单的内核进行某种类型的2D滤波
我们遗漏了你的一些信息,比如噪音的类型。因此,我将在手头有限的情况下尽我所能继续进行
首先,什么构成“太亮”?“太亮”仅仅是强度比相邻像素高出几个标准差,还是基本上是黑色或白色的像素
在后一种情况下,需要去除椒盐/脉冲噪声
你基本上要做一个3x3的空间滤波器,然后选择模式或中值。瞧,没有太亮的像素了。然而,这将有效地模糊你的图像,所以你可能会考虑使用自适应滤波,所以你只修改一个像素,如果它比周围的像素更亮,而不是修改所有像素。p>
最后,我们必须考虑到,你只需要根据一些统计值去除比周围像素更亮的像素,而不是仅仅是潜在的极端离群点(即:脉冲/椒盐噪声)。最后一种方法在CPU时间方面非常昂贵,但可以处理局部极值
http://www.mathsisfun.com/data/standard-deviation.html
如果将这种统计方法与自适应滤波技术相结合(即:检测哪些像素需要修改,而不是盲目修改所有可用像素),则可以删除问题像素,而不会对整体图像质量造成任何明显影响
<>最后,你还应该考虑关于图像处理的拉普拉斯算子。它可以作为一个简单的边缘检测器,也可以引导你朝着正确的方向前进http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm
祝你好运