不使用ConvolveOp在Java中手动锐化图像

时间:2015-06-09 06:34:45

标签: java image-processing

我试图了解如何手动处理图像。这是一个学校项目,所以我将无法使用ConvolveOp。我正在尝试手动完成它的工作。

根据我的阅读,锐化内核是这样的:

-1 -1 -1  
-1  9 -1  
-1 -1 -1  

这意味着新像素的值将是(9 * pixel - sum_of_neighbors)/ 9。如果我错了,请纠正我。但是我遇到了这种方法的问题。我认为这是因为我获得像素值的方式。

我试过更改使用的“内核”。但我要么在原始图像上获得一堆像素或红色像素。

我显然做了一件非常错误的事情。可能是我不应该使用.getRGB或者我不完全理解这种类型的图像处理是如何工作的。

更新:

感谢您指点Steffen。根据你的建议,我创建了一个三维数组。我使用3'rd维度来跟踪rgb值

感谢您指出这个错误。

1 个答案:

答案 0 :(得分:2)

您不应直接乘以RGB值。请检查此答案:Understanding BufferedImage.getRGB output values

您可以将图像分解为3个阵列(r,g,b),进行卷积,然后从单个通道构建3通道图像。

您的锐化内核是边缘过滤器和身份过滤器的补充:

身份是:

[ 0,0,0;
  0,1,0;
  0,0,0];

边缘过滤器是:

[ -1,-1,-1;
  -1, 8,-1;
  -1,-1,-1];

如果要缩放锐化的强度,则可以通过除以某个值来缩放边缘滤镜。但只有边缘过滤器。不是身份。所以,你的假设“(9 * pixel - sum_of_neighbors)/ 9”是不正确的。它将是“(1 *像素+(8 *像素+ sum_of_neigbors)/ some_value)”。 some_value可以是9,也可以是任何其他值。