在没有 ConvolveOp 的情况下手动锐化图像 Java
Manually Sharpen Image in Java without ConvolveOp
我正在尝试了解如何手动处理图像。这是一个学校项目,所以我无法使用 ConvolveOp。我正在尝试手动执行它的操作。
据我所知,锐化内核是这样的:
-1 -1 -1
-1 9 -1
-1 -1 -1
这意味着新像素的值为 (9*pixel - sum_of_neighbors)/9。如果我错了,请纠正我。但是我在使用这种方法时遇到了问题。我认为这是因为我获取像素值的方式。
我尝试更改使用的 "kernel"。但是我在原始图像上得到了一堆像素或红色像素。
我显然做错了很多事。可能是我不应该使用 .getRGB 或者我不完全理解这种类型的图像处理是如何工作的。
更新:
谢谢Steffen指点。根据您的建议,我创建了一个 3 维数组。我使用第 3 个维度来跟踪 rgb 值
感谢您指出错误。
您不应直接乘以 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*pixel +(8*pixel+sum_of_neigbors)/some_value)”。 some_value可以是9,也可以是其他任意值。
我正在尝试了解如何手动处理图像。这是一个学校项目,所以我无法使用 ConvolveOp。我正在尝试手动执行它的操作。
据我所知,锐化内核是这样的:
-1 -1 -1
-1 9 -1
-1 -1 -1
这意味着新像素的值为 (9*pixel - sum_of_neighbors)/9。如果我错了,请纠正我。但是我在使用这种方法时遇到了问题。我认为这是因为我获取像素值的方式。
我尝试更改使用的 "kernel"。但是我在原始图像上得到了一堆像素或红色像素。
我显然做错了很多事。可能是我不应该使用 .getRGB 或者我不完全理解这种类型的图像处理是如何工作的。
更新:
谢谢Steffen指点。根据您的建议,我创建了一个 3 维数组。我使用第 3 个维度来跟踪 rgb 值
感谢您指出错误。
您不应直接乘以 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*pixel +(8*pixel+sum_of_neigbors)/some_value)”。 some_value可以是9,也可以是其他任意值。