title: Seeded region growing with opencv
body: <p>I need to select a pixel value and apply the region growing in terms of the seed pixel. After trying to write the code, the result was always a black image
  regardless of what seed point I used. The whole problem is involved in the <code>GrowColor</code> function. My guess is a logical error with the ifs.</p>
  
  <pre><code>#include &lt;cv.h&gt;
  #include &lt;highgui.h&gt;
  
  using namespace std;
  
  int xDim, yDim, zDim;
  float ThreshHold = 45.0;
  unsigned long total[3];
  int coont, tt;
  IplImage *Image1;
  IplImage *Image2;
  
  CvScalar s = cvScalar(0, 0, 0, 0);
  CvScalar s11 = cvScalar(0, 0, 0, 0);
  
  int Diff, mean[3], temp[3];
  
  void GrowColor(int x, int y);
  
  int main(int argc, char *argv[]) {
  
      char value[4];
  
      int pixType, dimCut;
      int Dbug = false;
      int Xseed = 40, Yseed = 234;
      int i = 0, x, y;
      Image1 = cvLoadImage("lenah.jpg");
      yDim = Image1-&gt;height;
      xDim = Image1-&gt;width;
      // int step= Image1-&gt;widthStep;
      //uchar* data = (uchar *)Image1-&gt;imageData;
  
  //New image
      Image2 = cvCreateImage(cvSize(Image1-&gt;width, Image1-&gt;height), IPL_DEPTH_8U,
              1);
      cvZero(Image2);
      total[0] = total[1] = total[2] = coont = 0;
  
  //Process
  
      for (y = Yseed - 5; y &lt;= Yseed + 5; y++)
          for (x = Xseed - 5; x &lt;= Xseed + 5; x++)
              if ((x &gt; 0) &amp;&amp; (y &gt; 0) &amp;&amp; (x &lt; xDim) &amp;&amp; (y &lt; yDim)) {
  
                  coont++;
                  s = cvGet2D(Image1, x, y);
                  total[0] += abs(s.val[0]);
                  total[1] += abs(s.val[1]);
                  total[2] += abs(s.val[2]);
  
              }
  
      GrowColor(Xseed, Yseed);
      cvNamedWindow("wndname", 1);
      cvShowImage("original", Image1);
  
      cvShowImage("wndname", Image2);
      cvWaitKey(0);
      return 0;
  
  }
  
  void GrowColor(int x, int y) {
  //Check to see if point already part of region
  
      s.val[0] = 0;
      s.val[1] = 0;
      s.val[2] = 0;
      s.val[3] = 0;
      if ((x &lt; 1) &amp;&amp; (y &lt; 1))
          s = cvGet2D(Image2, x, y);
  
      if (s.val[0] == 0) {
          int k;
          if ((x == 1) &amp;&amp; (y == 1))
              s11 = cvGet2D(Image1, x, y);
          mean[0] = total[0] / coont;
          mean[1] = total[1] / coont;
          mean[2] = total[2] / coont;
  
          temp[0] = abs(s11.val[0]) - mean[0];
          temp[1] = abs(s11.val[1]) - mean[1];
          temp[2] = abs(s11.val[2]) - mean[2];
  
          Diff =
                  (int) (sqrt(
                          (temp[0] * temp[0] + temp[1] * temp[1]
                                  + temp[2] * temp[2]) / 3));
  
          if (Diff &lt; ThreshHold) {
  
              total[0] += abs(s11.val[0]);
              total[1] += abs(s11.val[1]);
              total[2] += abs(s11.val[2]);
              coont++;
              s.val[0] = 120;
              if ((x &gt; 0) &amp;&amp; (y &gt; 0))
                  cvSet2D(Image2, x, y, s);
              if (x &gt; 2)
                  GrowColor(x - 1, y);
              if (y &gt; 2)
                  GrowColor(x, y - 1);
              if (x &lt; xDim - 2)
                  GrowColor(x + 1, y);
              if (y &lt; yDim - 2)
                  GrowColor(x, y + 1);
  
          }
  
      }
  
  }
  </code></pre>