2011-10-26 22 views
-1

假设我有一个图像矩阵和我在一个特定的像素[说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加载sorrounding像素,请帮助我。

+2

拥有六个嵌套for循环几乎可以证明你错误的地方。你是否需要遍历所有像素或只有那些可以拥有全部八个“邻居”的人? – jrok

+0

只有那些可以有8个邻居....也是我以相同的方式访问所有像素的方式,我将通过计算所有像素的平均值并存储来自Color [RBG]数组'Pixel'的新值来存储值...到中心即“4”像素。 –

+1

你有很多有用的提示。最重要的是,你永远不会将结果写回图像。而且,我不想让人觉得苛刻,但正如有人说“开始学习编程 - 你的代码完全混乱”。 Everybodys代码在开始时是一个完整的混乱,我认为你应该尝试自己解决这个问题,并试图理解你在做什么。你没有OpenCV的麻烦。您在编写算法时遇到困难。一旦你完成了这个任务 - 你就会很好! :-) –

回答

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)应用到图像。

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) 
    } 
} 

注意我没有测试此代码。

+0

甚至不会编译... –

+0

我不知道opencv。例如,我只是猜测CvScalar.val的类型是uchar [3]。我只是想给你一个想法,而不是可编译的准备去代码:) – jrok

0

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

  • 首先,你必须从1开始的前两个for循环(因为你-1,当你申请的窗口递减)的,你最终会读一些内存未分配的地址。
  • 第二个第一个temp_ptr = &((uchar *)(image-> imageData +(image-> 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内循环

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

+0

alinoz你的答案是错误的,我不知道谁upvoted它...应该知道,数据类型CvScalar是一个结构,其中包含名为'val'的数组,您可以在其中存储'RBG'值! –

+0

好的在这方面你是对的。我会编辑那部分,但其余的我是对的。 – alinoz