0xDEADBEEF

[RSS]
««« »»»

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

21. 11. 2017

V Javě se dají ob­rázky jed­no­duše zost­řit pomocí tříd KernelCon­vol­veOp.

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)
}

Kla­sický pří­klad matice pro zostření, která je zmí­něna snad v každém tu­to­ri­álu:

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

Zna­mená to zná­so­bit hod­notu pixelu 9x a ode­číst od něj hod­noty všech sou­sed­ních. To zostří ob­rá­zek, ale efekt je příliš silný. Když chci jem­nějí de­taily, je po­třeba jiná matice. Dů­le­žité je, aby její součet byl 1.

Ta­ko­váto matice povede k de­li­kát­ně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í vo­li­telné in­ten­zity, může vy­pa­dat 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)