OpenCV处理单张图片占满16G内存且程序崩溃问题咨询
问题排查与解决方案
存在的错误
- 提前将uint8类型的灰度图转为float64类型,相同分辨率下float64数组内存占用是uint8的8倍,大幅提升了内存开销
- 存在无效绘制操作:用
plt.imshow显示一维高斯核g1,没有实际意义还会额外生成渲染缓存占用内存 - 没有释放无用的matplotlib画布:代码中多次调用
plt.imshow但没有显式关闭不需要的画布,matplotlib会在内存中保留所有绘制内容的缓存,高分辨率图像的渲染缓存甚至比原始数组大3-5倍,直接导致内存溢出 plt.imshow显示灰度图时没有指定cmap='gray',额外增加了颜色映射的计算和内存开销
16GB内存占用合理性判断
如果你处理的是分辨率超过30000×30000的超大幅图像,16GB占用属于正常情况;如果是普通分辨率(10000×10000及以下)的图像,该占用属于代码错误导致的异常情况。
修复方案
参考以下修改后的代码调整后,内存占用会下降90%以上:
import cv2 import matplotlib.pyplot as plt import numpy as np # 读取和转换图像时保留uint8类型,不需要提前转float f = cv2.imread('/content/gdrive/MyDrive/grass.png') f = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) # 第一段绘制完成后直接关闭画布释放缓存 plt.imshow(f, cmap='gray') plt.colorbar() plt.close() def gauss1(sigma, width): hwidth = round((width-1)/2) x = np.arange(-hwidth, hwidth+1,1) g = np.exp(-x**2/(2*sigma**2)) return g/np.sum(g) g1 = gauss1(2,11) g1 = np.reshape(g1,(1,-1)) f1 = cv2.filter2D(f, -1, g1) fig = plt.figure(figsize=(10, 20)) ax1 = fig.add_subplot(1,2,1) ax1.imshow(f, cmap='gray') ax2 = fig.add_subplot(1,2,2) ax2.imshow(f1, cmap='gray') plt.show() plt.close()
如果你的图像确实是超大幅的,可以将图像拆分为多个小块分批滤波,避免一次性加载全图占满内存。
内容的提问来源于stack exchange,提问作者grushenka
相关产品推荐
相关产品推荐

