| | |
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.
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:
CDC cdc;
cdc.Attach(i.GetDC());
COLORREF c,c1; long r,g,b; int avg;
for(int y=0;y<i.GetHeight();y++)
for(int x=0;x<i.GetWidth();x++){
c=cdc.GetPixel(x,y); 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)); }
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)){
if(x1==-1){
x1=x2=x3=x;y1=y2=y3=y;
}else if(sqrt(pow(x-x2,2.0)+pow(y-y2,2.0))<=d){
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");