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áto 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ření 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)