Introduction
Today, Image processing does a lot of work and can be applied in every subject such as medic, tumor detection, driving, speed getting, traffic analyse, edge detection, background extraction, text extraction, ...
With this algorithm, we can find knoll and get amount of arc of a line in every picture easily.
Using the Code And Algorithm
First of all, we must load the image from hard to program. We do it with CImage
Object.
CImage i;
i.Load(_T(“1.png”));
After that, we should grey the image for more easy processing. Working with two colors, black and white. We put black color where RGB is less than 80 and put white where RGB is more than 80 value. 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();
The next step is arc detection. The algorithm is:
First we look for first pixel that is not the back color (white) and call Point 1 (x1,y1)
. Then continue. Next pixel that has this trait, if it’s distance from pre point, it belongs to arc, else not. Keep on until we won't find the pixel that belongs to arc then last point we call Point 2(x2,y2)
. Point 3(x3,y3)
is knoll of arc. Put (x3,y3)
to pixel that has higher height.
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");
1. Original Image
2. Grey image
3. Processed image
The Solution And Points
For detecting the knoll of an arc without its function is difficult and we must use digital analyse to do this. But with image processing and this algorithm, we can do it easily and fast. It's useful.
Writer: Mahdi Nejadsahebi - mahdiacuransx@yahoo.com