c++ - 图像处理算法代码,解释指针

标签 c++ pointers

我正在查看图像处理算法袖珍手册 ( http://adaptiveart.eecs.umich.edu/2011/wp-content/uploads/2011/09/The-pocket-handbook-of-image-processing-algorithms-in-C.pdf ),我偶然发现了这段代码(如下)。

谁能帮我理解

*(Im->Data + (x)*Im->Cols + (y))

它在 pdf 第 33 页。

#define pix(Im,x,y) \
        *(Im->Data + (x)*Im->Cols + (y))
/* Compute and return area for objects */

int area(struct Image *In, int x1, int y1, int x2, int y2, unsigned char ObjVal){
    long i, j, rows;
    int area_value = 0;

    for(i=x1; i<=x2; ++i)
        for(j=y1; j<=y2; ++j){
            if(pix(In,i,j)==ObjVal)++area_value;
        }
    return(area_value);
}

最佳答案

Im 是指向 Image 结构的指针

Im->Data 指向缓冲区。我们称它为 buffer

Im->Cols 表示列数。 num_columns

buffer + x * num_columns + y 指向像素

顺便说一下,这是一种非常低效的遍历图像的方法,因为您要计算每个点的位置。

那里已经有一个 2 for 循环。使用这个宏没有意义。您可以轻松地使用单个指针并进行调整。

类似这样的东西会更有效率(我还没有测试过):

int area(struct Image *In, int x1, int y1, int x2, int y2, unsigned char ObjVal)
{
    int area_value = 0;

    unsigned char *p = Im->Data + x1 * Im->Cols + y1;  // Move to the first pixel

    int adj = In->Cols - (x2-x1)      // How much for the start of next row

    for(int i=x1; i<=x2; ++i, p += adj )
    {
        for(int j=y1; j<=y2; ++j, ++p)
        {
            if (*p == ObjVal) ++area_value;
        }
    }

    return area_value;
}

关于c++ - 图像处理算法代码,解释指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35776918/

相关文章:

c++ - 如何以编程方式将路由添加到网络接口(interface)

java - 如何使用 JNA 在 Java 中传递包含 char* 的结构并避免数据复制?

c++ - 为什么递增指针会给出随机数而不是内存地址?

c - 应该如何向多维数组添加元素? (在 C 中)

C - 何时使用指针算术,何时使用数组索引?

c++ - boost 文件系统3中的规范化功能

c++ - 十六进制字符串到 unsigned char[]

c++ - 我们如何在模板类中使用静态映射,模板类的每个实例化都应该使用相同的映射

c - 免费 malloc 指针位置问题

c++ - 从指针转换为非标量对象类型?