【问题标题】:Manually Sharpen Image in Java without ConvolveOp在没有 ConvolveOp 的情况下在 Java 中手动锐化图像
【发布时间】:2023-03-21 13:25:01
【问题描述】:

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

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

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

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

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

我显然做错了什么。可能是我不应该使用 .getRGB,或者我不完全理解这种类型的图像处理是如何工作的。

更新:

感谢Steffen 的指点。按照您的建议,我创建了一个 3 维数组。我使用第 3 维来跟踪 rgb 值

感谢您指出这个错误。

【问题讨论】:

  • 您不能就地执行此操作!您不能从 b 读取值并将它们写入 b。想想看。这是行不通的。此外,除以 18 应该只针对边缘内核。 -> )/18); 并且缺少负值:应该是8*b[...] - b[..] -b[...]
  • @Steffen 好的,所以 b[i][j][x] 的值应该是 (b[i][j][x] + (8*b[i][j] [x] - 邻居)/some_value)
  • @Steffen 通过此修改,一些像素已关闭(将发布更新)。至于b,我不太明白你的意思。我正在使用“b”来跟踪 .getRGB 和红色、绿色、蓝色的值。对颜色进行修改后,我将它们写入 a. “a”是主像素阵列。
  • 修改 b[1][1][2] 然后继续修改 b[1][2][2]。要修改此值,您需要访问 b[1][2-1][2],这基本上是您之前修改的值。这不应该发生。您需要原始颜色值。
  • 明白。基本上我需要一些中间变量才能不修改我的数组,例如: int red = b[1][1][2] + ( 8 * b[1][1][2] - neighbors)/value

标签: java image-processing


【解决方案1】:

您不应直接将 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,也可以是任何其他值。

【讨论】:

  • 感谢您的回复。我将查看您提供的答案。我希望它能澄清我的问题/困惑。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多