Opencv 如何优化代码以获得更好的执行时间
我正在实现一个名为BM3D的图像处理算法,我已经实现了对灰度图像去噪的结果,但问题是它太慢了,即使是436×436的灰度图像 我已经试着想办法加快我对数组和列表所做的工作,但并没有得到太多的改进Opencv 如何优化代码以获得更好的执行时间,opencv,image-processing,kotlin,Opencv,Image Processing,Kotlin,我正在实现一个名为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 tamanh
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")
}
实际图像去噪的效果很好,但是去噪436 x 436图像可能需要15分钟。我目前使用的是一个带有Ubuntu和4核的虚拟机,一个4 Gb的Ram让编译器变得更好、更高效是最简单的方法。但如果你的目标更高。如何从面向对象/ java编程风格改变C++,在所有这些数学方法上使用SSE /霓虹灯指令集?这应该给你最高的速度?请看这里的详细样品。436 X 436上的BM3D 15分钟有点糟糕。现在很多基于深度学习的方法可以运行得更快。是的,你是对的,但问题是我真的必须使用kotlin,并且已经实现了该算法,还有其他参数可以降低执行时间,例如块大小或窗口大小,但它会对给定代码的去噪效果非常差,我认为没有任何有效的改进方法。但是对于distBlock之类的东西,如果可能的话,可以尝试一些基于SSE的库。假设编译器优化了范围表达式和对象创建之类的东西,那么没有明显的性能改进。你需要运行一个分析器,看看时间花在了什么地方。更好、更高效的编译器是最简单的方法。但如果你的目标更高。如何从面向对象/ java编程风格改变C++,在所有这些数学方法上使用SSE /霓虹灯指令集?这应该给你最高的速度?请看这里的详细样品。436 X 436上的BM3D 15分钟有点糟糕。现在很多基于深度学习的方法可以运行得更快。是的,你是对的,但问题是我真的必须使用kotlin,并且已经实现了该算法,还有其他参数可以降低执行时间,例如块大小或窗口大小,但它会对给定代码的去噪效果非常差,我认为没有任何有效的改进方法。但是对于distBlock之类的东西,如果可能的话,可以尝试一些基于SSE的库。假设编译器优化了范围表达式和对象创建之类的东西,那么没有明显的性能改进。你需要运行一个分析器,看看时间花在哪里