Как я могу оптимизировать мой код для лучшего времени выполнения - PullRequest
0 голосов
/ 11 июня 2019

Я реализую алгоритм обработки изображений под названием BM3D, и я уже достиг результата, который снимает шум с изображения в градациях серого, но дело в том, что оно слишком медленное, даже с серым изображением 436 на 436.

Я уже пытался найти способ, возможно, ускорить работу, которую я выполняю с массивами и списками, но не получил большого улучшения

val img = imread("files/image.png", 0)
val img3= Mat(img.rows(),img.cols(),img.type())

val listaBlocos = mutableListOf(Pair(0.0, Pair(0,0)))
val tamanhoBloco = 3 //Block Size
val tamanhoJanela = 9 //Window Size
val mediaPorBloco = DoubleArray(16)
var sum = 0.0
listaBlocos.clear()
val stats_file = File("files/tempos436x436.txt")
val test = 10
for (x in 0 until test){
    val timeelapsed = measureTimeMillis {
        for (col in 20 ..img.width() - 20) {
            for (row in 20 ..img.height() - 20) {
                val block1 = generateBlock(img, row, col, tamanhoBloco)
                for (c in -tamanhoJanela..tamanhoJanela) {
                    for (l in -tamanhoJanela..tamanhoJanela) {
                        val  block2 = generateBlock(img, row + l, col + c, tamanhoBloco)
                        val  d = distBlock(block1, block2)
                        val  par = Pair(d, Pair(row + l, col + c))
                        listaBlocos.add(par)
                    }
                }
                val listaBlocosOrdenada = listaBlocos.sortedWith(compareBy { it.first })
                listaBlocos.clear()
                for (k in 0..15) {
                    sum = 0.0
                    val c2 = listaBlocosOrdenada[k].second.second
                    val l2 = listaBlocosOrdenada[k].second.first

                    for (c in 0..tamanhoBloco - 1) {
                        for (l in 0..tamanhoBloco - 1) {
                            sum += img.get(l2 - l, c2 - c)[0]
                        }
                    }
                    mediaPorBloco[k] = sum / 4
                }
                val v = mediaPorBloco.average()
                img3.put(row,col,v)

            }
        }
    }
imwrite("files/resultado.png", img3)
stats_file.appendText("teste$x 100X200 $timeelapsed\n")

}

Хорошо, результат в фактическом шумоподавлении изображения хороший, но может потребоваться 15 минут, чтобы шумоподавить изображение 436 x 436. В настоящее время я использую виртуальную машину с Ubuntu и 4 ядрами 4 ГБ ОЗУ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...