0xDEADBEEF

RSS
««« »»»

Java - zostřování obrázků

21. 11. 2017

V Javě se dají obrázky jednoduše zostřit pomocí tříd KernelConvolveOp.

def sharpen(src: BufferedImage): BufferedImage = {
  val kernel = new Kernel(3, 3, Array(-1f, -1f, -1f, -1f, 9f, -1f, -1f, -1f, -1f))
  val op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null)
  op.filter(src, null)
}

Klasický příklad matice pro zostření, která je zmíněna snad v každém tutoriálu:

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

Znamená to znásobit hodnotu pixelu 9x a odečíst od něj hodnoty všech sousedních. To zostří obrázek, ale efekt je příliš silný. Když chci jemnějí detaily, je potřeba jiná matice. Důležité je, aby její součet byl 1.

Takováhle matice povede k delikátnějšímu zostření:

-0.1 -0.1 -0.1
-0.1  1.8 -0.1
-0.1 -0.1 -0.1

Funkce, která dělá zostředí volitelné intenzity, může vypadat takhle:

def sharpen(src: BufferedImage, strength: Float): BufferedImage = {
  require(strength > 0 && strength < 1)
  val arr = Array.fill[Float](9)(-strength)
  arr(4) = 8 * strength + 1
  val kernel = new Kernel(3, 3, arr)
  val op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null)
  op.filter(src, null)
}
píše k47 (@kaja47, k47)