Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C++

Detect knoll of arc

1.00/5 (1 vote)
12 Jul 2012CPOL1 min read 14.3K   121  
Detect knoll of an arc.

Original image
Gray image
Processed image

Introduction

Today image processing can be applied in a variety of fields such as medical, tumor detection, driving, speed analysis, traffic analysis, edge detection, background extraction, text extraction, ...

With this algorithm we can find the knoll and get amount of arc of a line in every picture easily. For example, from figure 1, we want to get to figure 3.

Using the code

At first we must load the image to the program. We do it with the CImage object.

C++
CImage i;
i.Load(_T("1.png"));

After that we should grey the image to make the process more easy. Working with two colors, black and white. We put black color where average of RGB is less than 80 and put white where average of RGB is more than 80. To convert the image to gray-mode:

C++
CDC cdc;
//delaration an object from Class Device Content

cdc.Attach(i.GetDC());
//get Device Content from CImage (i)

COLORREF c,c1;         //define two color
long r,g,b;    //define red ,green, blue values
int avg;
for(int y=0;y<i.GetHeight();y++)
    for(int x=0;x<i.GetWidth();x++){
       c=cdc.GetPixel(x,y);           //get color from image
                                      //get RGB
       r=GetRValue(c); g=GetGValue(c);  b=GetBValue(c); avg=(r+g+b)/3;
       if(avg>80)r=255;
       else r=0;
       cdc.SetPixel(x,y,RGB(r,r,r));  //put color to image
    }
cdc.Detach();
i.ReleaseDC();

Next step is arc detection. The algorithm is:

We look for the first pixel that is not in black (white) and call Point 1 (x1,y1). Then continue. Next pixel that has this trait, if its distance from previous point is less than d, then it belongs to an arc else not. Keep on doing this until we won't find a pixel that belongs to the arc, then we call the last point Point 2(x2,y2). Point 3(x3,y3) is the knoll of the arc. To detect this while we’re looking pixels, put Point 3 = current point and see if its y is more than previous y (has higher height). Finally we get Point 3(x3,y3) as the knoll of the arc.

CDC cdc;
cdc.Attach(i.GetDC());
CPen p(PS_SOLID,1,RGB(255,255,0)),p1(PS_SOLID,1,RGB(0,0,255)),p2(PS_DASH,1,RGB(255,0,0));
cdc.SelectObject(&p);
register int x1=-1,x2,x3,y1,y2,y3,d=10;x1=x2=x3=y1=y2=y3=-1;
register COLORREF c;
for(register int x=0;x<i.GetWidth();x++)
    for(register int y=0;y<i.GetHeight();y++){
       c=i.GetPixel(x,y);
       if(c!=RGB(255,255,255)){//line detect
           if(x1==-1){//first point of line
                x1=x2=x3=x;y1=y2=y3=y;
           }else if(sqrt(pow(x-x2,2.0)+pow(y-y2,2.0))<=d){//next point
               x2=x;y2=y;
               if(abs(y2-y1)>=abs(y3-y1)){
                x3=x2;y3=y2;
               }
               cdc.SetPixel(x,y,RGB(255,255,0));
           }
       }
    }
register float length=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0));
cdc.SelectObject(&p1);
cdc.MoveTo(x3,y1);cdc.LineTo(x3,y3);
cdc.SelectObject(&p2);cdc.MoveTo(x1,y1);cdc.LineTo(x2,y2);
cdc.Detach();i.ReleaseDC();OnPaint();
float arc=4000*abs(y3-y2)/length;
CString s;char a[20]="";itoa(arc,a,10);s=a;s+=_T(" mM");

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)