【darknet源码解析-09】col2im.h 和 col2im.c 解析

本文详细解析了darknet中col2im.h和col2im_cpu.c的实现,通过实例展示了col2im如何将im2col操作后的数据恢复为原始图像矩阵排列。通过逐步的逆映射过程,阐述了col2im的工作机制。
摘要由CSDN通过智能技术生成

本系列为darknet源码解析, 本次解析src/col2im.h 与 src/col2im_cpu.c 两个. 这两个其实与之前所解析src/im2col.h 和 src/im2col.c的逆过程, col2im就是将im2col重排的图片data_col恢复到正常的图像矩阵排列。

col2img.h 中包含的代码如下:主要就是一个函数col2im.h定义,在这里我们也不涉及到gpu那块,先讲解cpu这块。

#ifndef COL2IM_H
#define COL2IM_H

void col2im_cpu(float* data_col,
        int channels, int height, int width,
        int ksize, int stride, int pad, float* data_im);

#ifdef GPU
void col2im_gpu(float *data_col,
        int channels, int height, int width,
        int ksize, int stride, int pad, float *data_im);
#endif
#endif

col2im.c 的详细分析如下:

#include <stdio.h>
#include <math.h>

/**
 * 将输入图像im的channel通道上的第row行,col列像素灰度值加上val(直接修改im的值,因此im相当于是返回值)
 * @param im 输入图像
 * @param height 输入图像的高度
 * @param width 宽度
 * @param channels 通道数
 * @param row 需要加上val的像素所在的行数(padding之后的行数,因此需要减去pad才能得到真正在im中的行数)
 * @param col 需要加上val的像素所在的列数
 * @param channel 需要加上val的像素所在的通道数
 * @param pad 补0的长度
 * @param val 像素灰度值
 */
void col2im_add_pixel(float *im, int height, int width, int channels,
                        int row, int col, int channel, int pad, float val)
{
    // 减去pad才能或者padding之前的所在行数和列数
    row -= pad;
    col -= pad;

    // 边界检查:超过边界,直接返回
    if (row < 0 || col < 0 ||
        row >= height || col >= width) return;

    im[col + width*(row + height*channel)] += val;
}
//This one might be too, can't remember.


/**
 * 此函数与im2col_cpu函数的流程相反,目的是将im2col_cpu()函数重排得到的图片data_col恢复至正常的图像矩阵形式,并与data_im相加,
 * 最终data_im相当于输出值, 需要注意的是, data_im的尺寸是在函数外确定的,且并没有显示的将data_co
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值