如何使用指针加载附近的像素

时间:2011-10-26 19:25:23

标签: c++ opencv

假设我有一个图像矩阵,我就像这样的特定像素[比如4]:

 0  1  2  
 3 `4` 5  
 6  7  8

我试图遍历所有像素并试图访问0,1,2,3,5 6,7,8,其值存储在名为Pixel的数组中....这里是我尝试使用OpenCV时,请告诉我哪里出错了。

我使用指针temp_ptr来访问IplImage image

    uchar* temp_ptr=0 ;
    CvScalar Pixel[3][3];
    int rows=image->height,cols=image->width,row,col;
    for( row = 0; row < rows-2; ++row) 
    {
        for ( col = 0; col < cols-2; ++col) 
            {               
                    temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*row)))[col*3];
                    for (int krow = -1 ; krow <= 1; krow++)
                    {
                        for (int kcol = -1; kcol <= 1; kcol++)
                        {       
                        temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3];
                            for(int i=0; i < 3; i++)
                            {
                                for(int j=0; j < 3; j++)
                                {
                                    for(int k=0; k < 3; k++)
                                    {
                                        Pixel[i][j].val[k]=temp_ptr[k];
                                    }
                                }
                            }

                        }
                    }
             }
    }

我不确定如何使用temp_ptr加载周围的像素,请帮助我。

3 个答案:

答案 0 :(得分:1)

先生,听起来你想要进行卷积,当你在指尖触摸OpenCV时这样做有点像在你的Spaghettios上敲打一个开罐器,用钝力将它打开。

事实上,你所做的几乎就是cv::blur(src, dst, cv::Size(3,3))的输出,除了它还包括平均值的中心像素。

如果要排除中心像素,则可以创建自定义内核 - 只需一个具有适当权重的矩阵:

[.125 .125 .125
 .125  0   .125
 .125 .125 .125 ]

并将其应用于cv::filter2d(src, dst, -1, kernel)的图片。

答案 1 :(得分:0)

假设image->imageData是RGB格式,那么每个像素有3个字节,你可以这样做:

int rows = image->height;
int cols = image->width;
uchar* temp_ptr = 0;

CvScalar pixels[8];

for (int col = 0; col < image->height - 2; col++) {
    temp_ptr = image->imageData + image->width * col + 1;
    for (int row = 0; row < image->width - 2; row++) {
        temp_ptr += row * 3;
        pixels[0].val = temp_ptr - width * 3 - 3;  // pixel 0 from your example
        pixels[1].val = temp_ptr - width * 3;      // 1
        pixels[2].val = temp_ptr - width * 3 + 3;  // 2
        pixels[3].val = temp_ptr - 3;              // 4
        pixels[4].val = temp_ptr + 3;              // etc...
        pixels[5].val = temp_ptr + width * 3 - 3;
        pixels[6].val = temp_ptr + width * 3;
        pixels[7].val = temp_ptr + width * 3 + 3;       

        // calculate averages here and store them somewhere (in a vector perhaps)
    }
}

注意我没有测试此代码。

答案 2 :(得分:0)

首先,你必须开始学习一些编程。你的完整代码是一团糟。 我可以很快发现一些主要问题:

  • 首先,您必须从1开始前两个for循环(因为在应用窗口时减少-1)并且最终会读取一些未分配的内存地址。
  • 第二个第一个temp_ptr =&amp;((uchar *)(image-&gt; imageData +(image-&gt; widthStep * row)))[col * 3]没用,所以你可以删除它。
  • 另一个

    temp_ptr  = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3];
    

有一个小问题,运算符优先级应该是:

  temp_ptr  = &((uchar*)(image->imageData + image->widthStep*(row+krow))[(col+kcol)*3];
  • 你不需要其他3个内部循环

还不清楚你想要做什么,你想得到一个特定像素的邻域(然后你不需要循环)或你想要从图像中的每个像素应用内核。