使用 gpu 使用 opencv 测量图像清晰度
Measure image sharpness with opencv using gpu
我创建了一个小脚本,它使用拉普拉斯算子从一组图像中提取最清晰的图像:
sharpness = cv2.Laplacian(cv2.imread(path), cv2.CV_64F).var()
不过代码有点慢,好像只用了CPU,那我想知道有没有用gpu计算那个值的方法,但是只找例子锐化图片.
在您知道需要时间之前不要进行优化。
大部分时间花在了加载图像上。时间,你会看到。这涉及访问大容量存储和解码图像格式。 PNG 并不是最复杂的,所以它可能更糟。
拉普拉斯计算使用a specific kernel。用任意 3x3 内核对图片进行卷积将花费 9 次乘法和 9 次加法。 这个内核成本一班五班adds/subs。 CPU 的 SIMD 早餐会吃这个。
GPU 根本无济于事。 将此数据传输 到 GPU 需要时间。然后还有其他恒定成本(延迟、“预热”)以在 GPU 上开始任何计算。 A CPU 已经完成计算。如果你有大量图片,至少传输可以流水线化,内核代码只需要上传一次。
GPU 和 CPU 在整个操作中都可能受内存限制,这意味着计算能力远未受到挑战。
如果您真的想让 GPU 参与进来,最简单的方法是将 numpy 数组包装在 cv.UMat
中,然后传入 UMat 对象。然后 OpenCV 将使用 OpenCL。结果将再次是 UMat,因此您需要查看 OpenCV 函数可以为您计算方差。
h_im = cv.imread(...) # hostside data
d_im = cv.UMat(im) # usable on "device"
d_lap = cv.Laplacian(d_im, cv.CV_32F) # single floats are usually faster than doubles
h_lap = d_lap.get() # retrieve data
# numpy functions unavailable on UMat, hence hostside calculation
var = h_lap.var()
# try cv.meanStdDev, calculates for each channel
我创建了一个小脚本,它使用拉普拉斯算子从一组图像中提取最清晰的图像:
sharpness = cv2.Laplacian(cv2.imread(path), cv2.CV_64F).var()
不过代码有点慢,好像只用了CPU,那我想知道有没有用gpu计算那个值的方法,但是只找例子锐化图片.
在您知道需要时间之前不要进行优化。
大部分时间花在了加载图像上。时间,你会看到。这涉及访问大容量存储和解码图像格式。 PNG 并不是最复杂的,所以它可能更糟。
拉普拉斯计算使用a specific kernel。用任意 3x3 内核对图片进行卷积将花费 9 次乘法和 9 次加法。 这个内核成本一班五班adds/subs。 CPU 的 SIMD 早餐会吃这个。
GPU 根本无济于事。 将此数据传输 到 GPU 需要时间。然后还有其他恒定成本(延迟、“预热”)以在 GPU 上开始任何计算。 A CPU 已经完成计算。如果你有大量图片,至少传输可以流水线化,内核代码只需要上传一次。
GPU 和 CPU 在整个操作中都可能受内存限制,这意味着计算能力远未受到挑战。
如果您真的想让 GPU 参与进来,最简单的方法是将 numpy 数组包装在 cv.UMat
中,然后传入 UMat 对象。然后 OpenCV 将使用 OpenCL。结果将再次是 UMat,因此您需要查看 OpenCV 函数可以为您计算方差。
h_im = cv.imread(...) # hostside data
d_im = cv.UMat(im) # usable on "device"
d_lap = cv.Laplacian(d_im, cv.CV_32F) # single floats are usually faster than doubles
h_lap = d_lap.get() # retrieve data
# numpy functions unavailable on UMat, hence hostside calculation
var = h_lap.var()
# try cv.meanStdDev, calculates for each channel