im2col函数解析

本文详细介绍了im2col函数的工作原理及其在卷积运算中的应用,通过代码实例展示了如何将多维图片转化为二维矩阵,以提高卷积运算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

im2col函数是进行卷积运算所常用的一个函数,它的作用是将进行卷积运算的一组图片二维化,而后再与卷积核进行矩阵相乘,代替了卷积运算原来相乘再相加的运算形式,可以大大减少运算所需时间。接下来介绍im2col函数的实现原理以及其不同形式。
先上代码

def im2col(input_img, FH, FW, stride=1, pad=0):
    """
    :param input_img: 输入的数据
    :param FH: 卷积核高度
    :param FW: 卷积核宽度
    :param stride: 卷积核移动步长
    :param pad: 填充
    :return: 图片二维返回值,高度为:(一组图片数目)*(输出图片宽度)*(输出图片高度),宽度为:(通道)*(滤波器高度)*(滤波器宽度)
    """
    N, C, H, W = input_img.shape
    out_h = 1 + int((H + 2 * pad - FH) / stride)
    out_w = 1 + int((W + 2 * pad - FW) / stride)
    img = np.pad(input_img, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')  # 在行始填充pad个0,行末填充pad个0,列始,列末同理
    out_img = np.zeros((N, C, FH, FW, out_h, out_w))
    for y in range(FH):
        y_max = y + out_h * stride
        for x in range(FW):
            x_max = x + out_w * stride
            out_img[:, :, y, x, :, :] = img[:, :, y:y_max:stride,
                                        x:x_max:stride] 
    out_img = np.transpose(out_img,
                           (0, 4, 5, 1, 2, 3))  # 换轴函数,读取维度顺序为N,OH,OW,C,FH,FW,逻辑为将N张图片读取为OH,OW二维,内容为C个通道FH,FW的原始图片
    out_img = out_img.reshape(N * out_h * out_w, -1)  # 将图片reshape为高度为N*out_h*out_w,宽度为C*FW*FH的二维数据
    return out_img

原理:我们先建立了初始输出数组,它的shape按顺序表为

  1. 图片数目

  2. 图片维度

  3. 滤波器高度

  4. 滤波器宽度

  5. 输出图片的高度(也表示了纵轴上滤波器个数

  6. 输出图片的宽度(也表示了横轴上滤波器个数

    利用for循环,我们向输出数组中每张图片每个维度纵轴横轴所确定的滤波器中对应位置,即**(y,x)**赋上了原图的相应值,也就是说我们获取了第N张图片第C个通道上第(out_h,out_w)个滤波器的(y,x)的值。
    目前坐标读取顺序为(N,C,FH,FW,out_h,out_w),而需要得到的坐标顺序应该为(N,out_h,out_w,C,FH,FW),以通过reshape(默认顺序为从右到左展开)函数二维化,因此我们还需使用transhpose函数改变坐标读取顺序,最后再reshape一下就完成了。

变体:可以看到我们在for循环当中是写入(y,x)位置所有滤波器的信息,其实也可以写入(out_h,out_w)个滤波器所有位置信息,只是这样会使循环次数变多,但这种方法可以使我们更好的了解im2col这一方法的本质就是写入坐标再改变读取顺序,变体代码如下:

def im2col(input_img, FH, FW, stride=1, pad=0):
    """
    将多维图片转化为二维
    :param input_data: 输入的数据
    :param filter_h: 卷积核高度
    :param filter_w: 卷积核宽度
    :param stride: 卷积核移动补偿
    :param pad: 填充
    :return: 二维数组
    """
    N, C, H, W = input_img.shape
    out_h = 1 + int((H + 2 * pad - FH) / stride)
    out_w = 1 + int((W + 2 * pad - FW) / stride)
    img = np.pad(input_img, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')  # 在行始填充pad个0,行末填充pad个0,列始,列末同理
    out_img = np.zeros((N, C, FH, FW, out_h, out_w))
    for y in range(out_h):
        y_left=y*stride
        for x in range(out_w):
            x_left=x*stride
            out_img[:, :, :, :, y, x] = img[:, :, y_left:y_left+FH,
                                        x_left:x_left+FW]  # 对应(x,y)的fillter维度:包含数据为维度顺序为N,C,y方向滤波器覆盖范围,x方向滤波器覆盖范围
    out_img = np.transpose(out_img,
                           (0, 4, 5, 1, 2, 3))  # 换轴函数,读取维度顺序为N,OH,OW,C,FH,FW,逻辑为将N张图片读取为OH,OW二维,内容为C个通道FH,FW的原始图片
    out_img = out_img.reshape(N * out_h * out_w, -1)  # 将图片reshape为高度为N*out_h*out_w,宽度为C*FW*FH的二维数据
    return out_img
<think>好的,用户现在问的是关于MATLAB中的col2im函数。之前他们询问过OLA处理音频的实例,现在转向图像处理相关的函数。首先,我需要确定用户的需求是什么。可能他们在进行图像处理,特别是涉及分块操作,比如卷积神经网络中的im2col和col2im的配合使用。 首先,我需要回忆col2im函数的基本功能。根据MATLAB文档,col2im用于将矩阵的列重新排列成图像块,通常与im2col配合使用。用户可能在图像处理或深度学习中使用到这些函数,比如在实现卷积操作时,将图像转换为列形式进行处理,然后再还原回来。 接下来,要思考用户为什么会用到这个函数。可能的场景包括图像重建、滑动窗口处理、或者自定义的卷积操作。比如,用户可能在对图像进行分块处理(如滤波、特征提取)后,需要将处理后的列数据重新组合成完整的图像,这时候就需要col2im。 然后,要考虑用户可能遇到的问题。比如参数设置不正确导致图像尺寸错误,或者不理解如何与im2col配合使用。需要详细解释函数的参数,特别是block类型('distinct'或'sliding')的区别,以及size参数的意义。 另外,用户可能对实际应用例子感兴趣,比如图像锐化或去噪。这时候需要提供一个简单的示例代码,展示如何结合im2col和col2im进行图像处理,并解释每一步的作用。同时,要提到性能优化的问题,比如处理大图像时的内存消耗,以及可能的替代方案,如使用blockproc函数。 还需要注意潜在的错误和解决方法,比如尺寸不匹配时的错误提示,如何处理这些情况。此外,用户可能对函数的数学原理不太清楚,需要简要解释列展开和重构的过程,特别是对于滑动窗口的情况,如何通过重叠区域的平均来还原图像。 最后,总结col2im的主要应用场景,并提醒用户在实际使用中可能需要注意的问题,如数据类型转换、内存管理等。确保回答结构清晰,步骤明确,帮助用户逐步理解和应用该函数。</think>在MATLAB中,`col2im` 函数用于将按列排列的图像块重新组合成完整图像,通常与`im2col`函数配合使用,实现图像分块处理与重构。以下是详细解析: --- ### **核心功能** - **逆向操作**:`col2im` 是 `im2col` 的逆过程 - **典型应用场景**: - 滑动窗口处理(如卷积操作后的数据重组) - 图像分块处理后的重构(去噪、滤波等) - 深度学习中的特征图重构 --- ### **函数语法** ```matlab A = col2im(B, [m n], [M N], 'distinct') % 非重叠分块模式 A = col2im(B, [m n], [M N], 'sliding') % 滑动窗口模式 ``` #### **参数说明** | 参数 | 描述 | |------------|----------------------------------------------------------------------| | `B` | 输入列矩阵,每列代表一个图像块 | | `[m n]` | 每个图像块的尺寸(行×列) | | `[M N]` | 输出图像的尺寸(行×列) | | `'distinct'`| 非重叠分块模式,要求原始图像可被完整分块 | | `'sliding'` | 滑动窗口模式(默认),处理卷积类操作 | --- ### **工作模式对比** #### 1. **'distinct' 模式** - **特点**:非重叠分块重构 - **数学关系**: - 输入列数必须等于 $(M/m) \times (N/n)$ - 输出图像尺寸需满足 $M = k \times m$, $N = l \times n$ (k,l为整数) **示例**: ```matlab % 将图像分为2x2块处理 I = reshape(1:16,4,4); % 创建4x4测试矩阵 B = im2col(I,[2 2],'distinct'); % 分块展开为列 recon_I = col
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值