Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   histogram equalization for medical images (http://www.go4expert.com/forums/histogram-equalization-medical-images-t19575/)

metamofia 28Sep2009 06:40

histogram equalization for medical images
 
1 Attachment(s)
hi, im currently on a final year project and im doing hist. equalization for medical images. im progressing pretty alright.. so far, i have came up with codes to do this project.

Code: CPP

void CLEO_MedivisionView::OnToolsHistogram()
{
// TODO: Add your command handler code here
    int x_tick, y_tick;
    int j;
    int a_loop, b_loop;
    int k, t, f, i;
    int x;
    int q;
    unsigned int intMFC;
    unsigned int intMFC1;
    unsigned int intMFC2;
    unsigned short array1[256];
    char c[10];
    char p[10];
    char l[10];
    CString MFCString;
//unsigned short array1[65535];
    pDC = GetDC(); //OnDraw member function
    hdc = pDC->GetSafeHdc();
    CPen aPen;
    aPen.CreatePen(PS_SOLID, 2, RGB(255, 225, 225));
    CPen* pOldPen = pDC->SelectObject(&aPen);

    pDC->MoveTo(600,400); //drawing of x-axis
    pDC->LineTo(920,400);
    pDC->MoveTo(920,400);
    pDC->LineTo(915,405);
    pDC->MoveTo(920,400);
    pDC->LineTo(915,395); //drawing of x-axis

    x_tick = 600; //declaring constants
    y_tick = 400;
    for (j=1; j<=10; j++) //control the loop so that it draws ticks every 30 pixels
    {
        pDC->MoveTo(x_tick+(j*30),y_tick-5);
        pDC->LineTo(x_tick+(j*30),y_tick+5);
    }
    pDC->MoveTo(600,400); //drawing of y-axis
    pDC->LineTo(600,80);
    pDC->MoveTo(600,80);
    pDC->LineTo(605,85);
    pDC->MoveTo(600,80);
    pDC->LineTo(595,85); //drawing of y-axis
    for (t=1; t<=10; t++) //control the loop so that it draws ticks every 30 pixels
    {
        pDC->MoveTo(x_tick-5,y_tick-(t*30));
        pDC->LineTo(x_tick+5,y_tick-(t*30));
    }
    intensity= "Intensity"; //labelling of x-axis
    SetBkColor(hdc, RGB(0, 0, 0));
    SetTextColor(hdc, RGB(255, 255 ,255 ));
    TextOut(hdc, 930, 390, LPCTSTR(intensity), 9);
    pixels = "Pixels"; //labelling of y-axis
    SetTextColor(hdc, RGB(255, 255 ,255 ));
    TextOut(hdc, 580, 55, LPCTSTR(pixels), 6);
    numeric = "0"; //number zero (universal)
    SetTextColor(hdc, RGB(95, 158, 160));
    TextOut(hdc, 585, 400, LPCTSTR(numeric),1);
    intMFC = 0; //declaring constants
    a_loop = 595;
    for (k=1; k<=5; k++) //for every two ticks, draw legend of +52 each time it loops
    {
        intMFC = intMFC+52;
        itoa(intMFC,c,10);
        CString MFCString;
        MFCString = c;
        if (intMFC<100) //if number is XX then just show 2 digits
        {
            test = c;
            SetTextColor(hdc, RGB(95, 158 ,160));
            TextOut(hdc, a_loop+(k*60), 405, LPCTSTR(test), 2);
        }
        else if (intMFC>=100) //if number is XXX then show 3 digits
        {
            test = c;
            SetTextColor(hdc, RGB(95, 158, 160));
            TextOut(hdc, a_loop+(k*60), 405, LPCTSTR(test), 3);
        }
    }
    intMFC1 = 0; //declaring of contants
    intMFC2 = 0;
    b_loop = 392;

    if (no_of_rows == 256 && no_of_cols == 256) // opens if image its by 256*256

    {
        for (f=1; f<=5; f++) // for 5-ticks axis
        {
            intMFC1 = (((256 * 256)/5)+0.3) * f; // calculate each of the 5 marking is +13107
            itoa(intMFC1,p,10);
            CString MFCString;
            MFCString = p;
            test1 = p;
            SetTextColor(hdc, RGB(95, 158 ,160));
            TextOut(hdc, 540, b_loop-(f*60), LPCTSTR(test1), 5); // type casting
        }
    }
    else if (no_of_rows == 512 && no_of_cols == 512) // if image is 512*512 run this
    {
        for (q=1; q<=5; q++) // for 5-ticks axis
        {
            intMFC2 = (((512 * 512)/5)+0.8) * q; // to calculate each marking is +52428
            itoa(intMFC2,l,10);

            MFCString = l;
            if (intMFC2<100000) //'if' statement used because if digit is less
//than 100000, it shows crap at the last digit position
            {
                test2 = l;
                SetTextColor(hdc, RGB(95, 158 ,160));
                TextOut(hdc, 540, b_loop-(q*60), LPCTSTR(test2), 5);
            }
            else if (intMFC2>=100000) //if digit is more or equal to 100000, do this
            {
                test2 = l;
                SetTextColor(hdc, RGB(95, 158, 160));
                TextOut(hdc, 540, b_loop-(q*60), LPCTSTR(test2),6);
            }
        }
    }


//count pixel intensity
//'for' loop couting from 0 to 255 which simply zeros out each element in array1 to prepare the array to do the count of the bytes in the image
    for (i=0;i<255;i++)
    {
        array1[i]=0;
    }
//'for' loop to loop through the bytes of the image
    for (i=0; i<262143; i++)
    {
        array1[image[i]]++;
    }



so this is the code so far and i have commented out the function of each code descriptions.. right now i have write up the code to get the pixel value of the image. so i need to draw lines on the histogram to represent it.. how do i go about doing it?

i will attach what its suppose to display until this codes in this thread. thanks for the help in adv!

xpi0t0s 28Sep2009 12:54

Re: histogram equalization for medical images
 
> 'for' loop to loop through the bytes of the image

OK, one way to check the colour if an individual pixel is to call GetPixel which will return the RGB() value it finds at that point on the screen. So GetPixel(x,y) where (x,y) is black will return RGB(0,0,0). Probably if the image is greyscale then R=G=B but if not you'll need to find some way of computing intensity from three RGB values.

However if you prefer to get the data directly from image[] then you'll need to know how image[n] is converted to one or more pixels on the screen, and you can use that to calculate the intensity of the pixel(s) represented by each entry in image[].

Otherwise array1[image[i]]++; (as you already have done) seems a good way to me of increasing the count for each individual intensity value, and the representation for that in the histogram could just be a case of drawing a vertical line that is array1[n] pixels long at x=n, and from the code I can see you already know how to draw a straight line.

metamofia 28Sep2009 13:05

Re: histogram equalization for medical images
 
hey thanks for replying to my post. so i wanna draw a vertical line for example:
pDC->MoveTo(x,y);
pDC->LineTo(x,y);

the values of x need to be in referrence with image[i] and y would be in referrence to i? or is it vice versa?

xpi0t0s 28Sep2009 14:26

Re: histogram equalization for medical images
 
Depends which way round you're drawing it. You could experiment and see which way fits what you had in mind.
If you're drawing a series of horizontal lines, say:
Code:

------
--------------
-

---------------------
-----------------

then MoveTo(0,i) and LineTo(image[i],i) could do the trick, or if vertical lines coming up from the bottom then you'll have to swap the parameters and do some subtraction (because (0,0) is at the top left, not at the bottom left according to the normal rules of graphing).

metamofia 28Sep2009 14:48

Re: histogram equalization for medical images
 
yeah.. i tried it but nothing displays on the graph.. is there any alternative way that i could do to troubleshoot this?

xpi0t0s 28Sep2009 20:12

Re: histogram equalization for medical images
 
What is the code in the for loop? It's difficult to determine what's wrong with it if I can't see it.

metamofia 29Sep2009 06:44

Re: histogram equalization for medical images
 
ouh which for loop you are talking about? the most recent for loop is to calculate the pixel intensity. so i actually want to draw a line for 'testing' if the code which i wrote ACTUALLY works, or otherwise.

xpi0t0s 29Sep2009 12:37

Re: histogram equalization for medical images
 
In your previous post you said "i tried it but nothing displays on the graph". That's the code I'm talking about. You know, the code that doesn't work and that I can't work out what's wrong with it if I can't see it? It might not be in a for loop, there are other ways of looping, but for is the most likely.

metamofia 30Sep2009 06:52

Re: histogram equalization for medical images
 
hi thanks for replying. well somehow i have edited the codes over time. i will update to u about it now.

Code:


//**************************************************************************************//
void CLEO_MedivisionView::OnUpdateToolsHistogram(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here

if (fileopen) {
pCmdUI->Enable(
true);
}
else {
pCmdUI->Enable(
false);
}
}
void CLEO_MedivisionView::OnToolsHistogram()
{
// TODO: Add your command handler code here
int x_tick, y_tick;
int j;
int a_loop, b_loop;
int k, t, f, i;
int x;
int q;
unsignedint intMFC;
unsignedint intMFC1;
unsignedint intMFC2;
unsignedshort array1[256];
char c[10];
char p[10];
char l[10];
CString MFCString;
//unsigned short array1[65535];
pDC = GetDC(); //OnDraw member function
hdc = pDC->GetSafeHdc();
CPen aPen;
aPen.CreatePen(PS_SOLID, 2, RGB(255, 225, 225));
CPen* pOldPen = pDC->SelectObject(&aPen);

pDC->MoveTo(600,400);
//drawing of x-axis
pDC->LineTo(920,400);
pDC->MoveTo(920,400);
pDC->LineTo(915,405);
pDC->MoveTo(920,400);
pDC->LineTo(915,395);
//drawing of x-axis

x_tick = 600;
//declaring constants
y_tick = 400;
for(j=1; j<=10; j++) //control the loop so that it draws ticks every 30 pixels
{
pDC->MoveTo(x_tick+(j*30),y_tick-5);
pDC->LineTo(x_tick+(j*30),y_tick+5);
}
pDC->MoveTo(600,400);
//drawing of y-axis
pDC->LineTo(600,80);
pDC->MoveTo(600,80);
pDC->LineTo(605,85);
pDC->MoveTo(600,80);
pDC->LineTo(595,85);
//drawing of y-axis
for(t=1; t<=10; t++) //control the loop so that it draws ticks every 30 pixels
{
pDC->MoveTo(x_tick-5,y_tick-(t*30));
pDC->LineTo(x_tick+5,y_tick-(t*30));
}
intensity=
"Intensity"; //labelling of x-axis
SetBkColor(hdc, RGB(0, 0, 0));
SetTextColor(hdc, RGB(255, 255 ,255 ));
TextOut(hdc, 930, 390, LPCTSTR(intensity), 9);
pixels =
"Pixels"; //labelling of y-axis
SetTextColor(hdc, RGB(255, 255 ,255 ));
TextOut(hdc, 580, 55, LPCTSTR(pixels), 6);
numeric =
"0"; //number zero (universal)
SetTextColor(hdc, RGB(95, 158, 160));
TextOut(hdc, 585, 400, LPCTSTR(numeric),1);
intMFC = 0;
//declaring constants
a_loop = 595;
for(k=1; k<=5; k++) //for every two ticks, draw legend of +52 each time it loops
{
intMFC = intMFC+52;
itoa(intMFC,c,10);
CString MFCString;
MFCString = c;
if(intMFC<100) //if number is XX then just show 2 digits
{
test = c;
SetTextColor(hdc, RGB(95, 158 ,160));
TextOut(hdc, a_loop+(k*60), 405, LPCTSTR(test), 2);
}
elseif(intMFC>=100) //if number is XXX then show 3 digits
{
test = c;
SetTextColor(hdc, RGB(95, 158, 160));
TextOut(hdc, a_loop+(k*60), 405, LPCTSTR(test), 3);
}
}
intMFC1 = 0;
//declaring of constants
intMFC2 = 0;
b_loop = 392;

if (no_of_rows == 256 && no_of_cols == 256) // initiate if image its by 256*256
{
for(f=1; f<=5; f++) // for 5-ticks axis
{
intMFC1 = (((256 * 256)/5)+0.3) * f;
// calculate each of the 5 marking is +13107
itoa(intMFC1,p,10);
CString MFCString;
MFCString = p;
test1 = p;
SetTextColor(hdc, RGB(95, 158 ,160));
TextOut(hdc, 540, b_loop-(f*60), LPCTSTR(test1), 5);
// type casting
}
}
elseif (no_of_rows == 512 && no_of_cols == 512) // if image is 512*512 run this
{
for(q=1; q<=5; q++) // for 5-ticks axis
{
intMFC2 = (((512 * 512)/5)+0.8) * q;
// to calculate each marking is +52428
itoa(intMFC2,l,10);

MFCString = l;
if(intMFC2<100000) //'if' statement used because if digit is less
//than 100000, it shows crap at the last digit position
{
test2 = l;
SetTextColor(hdc, RGB(95, 158 ,160));
TextOut(hdc, 540, b_loop-(q*60), LPCTSTR(test2), 5);
}
elseif(intMFC2>=100000) //if digit is more or equal to 100000, do this
{
test2 = l;
SetTextColor(hdc, RGB(95, 158, 160));
TextOut(hdc, 540, b_loop-(q*60), LPCTSTR(test2),6);
}
}
}

//count pixel intensity

//'for' loop couting from 0 to 255 which simply zeros out each element in array1 to prepare the array to do the count of the bytes in the image
for (i=0;i<255;i++)
{
array1[i]=0;
}
if (no_of_rows == 512 && no_of_cols == 512)
{
//'for' loop to loop through the bytes of the image
for (i=0; i<262143; i++)
{
array1[image[i]]++;
}
}
elseif (no_of_rows == 256 && no_of_cols == 256)
{
for (i=0; i<65535; i++)
{
array1[image256[i]]++;
}
}



pDC->MoveTo( 600, 400);
for (i=1; i<255; i++)
{
pDC->MoveTo( 600 + i, 400);
pDC->LineTo( 600 + i, Y );
}
}



the code in green and red is the new addition to it and its supposed to draw lines for the number of pixels in respect to its intensity value ie how many pixels has a value of 20. so this code is somewhat 'approved' from my supervisor. the only thing is that, the code line in red needs to be changed. im not too sure what i should input on the position 'Y'. i can try a few errors but i get my app to crash at times. so maybe u can help me on what to replace the Y with. thanks in advance!

xpi0t0s 30Sep2009 12:27

Re: histogram equalization for medical images
 
Did you try 400-array1[i]?

This may need scaling though if array1[i] ever exceeds 400 (so if array[i] can reach 800, then you'll need to divide by 2 to fit the graph to the screen).

What is the range of numbers stored in image256 (ie what are the min and max)?


All times are GMT +5.5. The time now is 17:08.