python图像遍历优化的方法:
使用numpy自带的滑动窗口进行优化
注意:numpy版本必须不小于1.20.0。
滑动窗口函数介绍:请参考这篇文章
以中值滤波为例(优化前与优化后的对比)
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 11 06:24:33 2021
@author: 陨星落云
csdn博客地址: https://blog.csdn.net/qq_28368377
"""
import imageio
import numpy as np
import matplotlib.pylab as plt
import time
def MedianFilterV1(img,K_size=3):
# 中值滤波V1
h,w,c = img.shape
# 零填充
pad = K_size//2
out = np.zeros((h + 2*pad,w + 2*pad,c),dtype=np.float32)
out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float32)
# 卷积的过程
tmp = out.copy()
for y in range(h):
for x in range(w):
for ci in range(c):
out[pad+y,pad+x,ci] = np.median(tmp[y:y+K_size,x:x+K_size,ci])
out = out[pad:pad+h,pad:pad+w].astype(np.uint8)
return out
def MedianFilterV2(img,K_size=3):
# 中值滤波V2(利用numpy的滑动窗口优化)
h,w,c = img.shape
# 零填充
pad = K_size//2
out = np.zeros((h + 2*pad,w + 2*pad,c),dtype=np.float32)
out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float32)
# 卷积的过程
tmp = img.copy()
for ci in range(c):
tmp[:,:,ci] = np.median(np.lib.stride_tricks.sliding_window_view(out[:,:,ci],(K_size,K_size)).reshape(h,w,-1),axis=2)
return tmp.astype(np.uint8)
if __name__ == "__main__":
# 读取图像
img = imageio.imread("lenaNoise.png")
# 中值滤波V1
t0 = time.time()
MedianFilterV1(img)
print("MedianFilterV1所需时间:",time.time()-t0)
# 中值滤波V2
t1 = time.time()
MedianFilterV2(img)
print("MedianFilterV2所需时间:",time.time()-t1)
# 显示图像
plt.figure(figsize=(20,16))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(MedianFilterV2(img))
plt.show()
时间对比:
MedianFilterV1所需时间: 53.56235074996948
MedianFilterV2所需时间: 0.18052363395690918
结果图: