python图像遍历优化的方法总结(以中值滤波为例)

python图像遍历优化的方法:

  1. 使用numba加速:请参考这篇文章
  2. 使用GPU加速:请参考这篇文章
  3. 今天介绍一种新的优化方法
使用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

结果图:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陨星落云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值