Click here to Skip to main content
15,897,704 members
Articles / Programming Languages / C++
Tip/Trick

Detect knoll of arc

Rate me:
Please Sign up or sign in to vote.
1.00/5 (1 vote)
12 Jul 2012CPOL1 min read 13.8K   121   1   5
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)



Comments and Discussions

 
General[My vote of 1] Nothing to see here... Pin
Matt T Heffron13-Jul-12 12:50
professionalMatt T Heffron13-Jul-12 12:50 
GeneralRe: [My vote of 1] Nothing to see here... Pin
Mahdi Nejadsahebi31-Jul-12 19:26
Mahdi Nejadsahebi31-Jul-12 19:26 
GeneralRe: [My vote of 1] Nothing to see here... Pin
Matt T Heffron1-Aug-12 6:58
professionalMatt T Heffron1-Aug-12 6:58 
QuestionRe: [My vote of 1] Nothing to see here... Pin
Mahdi Nejadsahebi18-Oct-12 2:54
Mahdi Nejadsahebi18-Oct-12 2:54 
AnswerRe: [My vote of 1] Nothing to see here... Pin
Matt T Heffron18-Oct-12 11:03
professionalMatt T Heffron18-Oct-12 11:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.