Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Help me out with this C code for histogram equalization (http://www.go4expert.com/forums/help-c-code-histogram-equalization-t13827/)

getbiplab 14Sep2008 10:28

Help me out with this C code for histogram equalization
 
Code:

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <mem.h>
#include <string.h>
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <math.h>

unsigned char r[360],mini,mode;
unsigned char rgb[256][3],rgb2[256][3],**rgb1,t;
char *fullname;
char *fname;
int hist[256],tmp=0,sum=0;
unsigned int screen_width=320;
unsigned int first_row=0,first_column=0,last_row=0,last_column=0;
int handle,i,j,rem,color_bits;
long int file_size,data_offset,size_info_header,width,height,compression,
              image_size,xpelspermeter,ypelspermeter,colorsused,k,colorsimpt,p,index,max,min,**sum_hist;
float theta,temp;
void drawdot(int x, int y, int pal_index){
                _AX=pal_index;
                _CX=x;
                _DX=y;
                _AH=0x0c;
                _BH=0x00;
                geninterrupt(0x10);
}

void main(){

        gets(fname);
        strcpy(fullname,fname);strcat(fullname,".bmp");
        handle=_open(fullname,O_RDONLY);if (handle==-1) exit(EXIT_FAILURE);
        _read(handle,r,2);if (r[0] !='B' | r[1] !='M') exit(EXIT_FAILURE);
        _read(handle,r,4);file_size=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,2);_read(handle,r,2);
        _read(handle,r,4);data_offset=r[0]+256*r[1]+65536*r[2]+0x1000000*r[3];
        _read(handle,r,4);size_info_header=r[0]+256*r[1]+65536*r[2]+0x1000000*r[3];
        if (size_info_header !=40) exit(EXIT_FAILURE);
        _read(handle,r,4);width=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        if (width > screen_width) exit(0);
        _read(handle,r,4);height=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,2);if (r[0] != 1) exit(EXIT_FAILURE);
        _read(handle,r,2);
        color_bits=r[0];
        _read(handle,r,4);
        compression=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,4);
        image_size=r[0]+256*r[1]+256*256*r[2]+256*256*256*r[3];
        _read(handle,r,4);
        xpelspermeter=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,4);
        ypelspermeter=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,4);
        colorsused=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];
        _read(handle,r,4);
        colorsimpt=r[0]+0x100*r[1]+0x10000*r[2]+0x1000000*r[3];

        _AX=0x1201;_BL=0x33;geninterrupt(0x10);//don't add RGB
        _AX=0x0013;geninterrupt(0x10);//set mode 13 i.e. 320x200x256

        for (i=0;i<256;i++) {
                _read(handle,r,4);
                rgb[i][0]=r[2]>>2;rgb[i][1]=r[1]>>2;rgb[i][2]=r[0]>>2;
        }
        rgb1=calloc(height,sizeof(char*));
        for(i=0;i<height;i++)
        rgb1[i]=calloc(width,sizeof(char));
        for (i=0;i<256;i++) {
                rgb2[i][0]=i;rgb2[i][1]=i;rgb2[i][2]=i;
        }
        _ES=FP_SEG(rgb2);_DX=FP_OFF(rgb2);
        _BX=0;_CX=0x100; _AX=0x1012;
        geninterrupt(0x10);//set DAC from rgb
        first_column=(screen_width-width)/2;
        last_row=first_row+height-1;last_column=first_column+width-1;
        rem=4 - (width % 4);
        for (i=0;i<=height-1;i++) {
                _read(handle,r,width);

                for (j=0;j<=width-1;j++)
                {
                //drawdot(first_column+j,last_row-i,r[j]);
                rgb1[i][j]=(rgb2[r[j]][0]+rgb2[r[j]][1]+rgb2[r[j]][2])/3;
                //printf("%d\n",rgb1[i][j]);
                //delay(100);
                }
                if (rem==1) _read(handle,r,1);
                else if (rem==2) _read(handle,r,2);
                else if (rem==3) _read(handle,r,3);//getch();
        }
       
        for(i=0;i<256;i++)
                {
                        hist[i]=0;
                    }
        for(i=0;i<height;i++)
        {
                for(j=0;j<width;j++)
                {
                        k=(long int)rgb1[i][j];
                        hist[k]=hist[k]+1;
                }
        }

        for(i=0;i<256;i++)
        {
                if(hist[i]!=0)
                tmp++;
                else continue;
        }

        sum_hist=(long int **)calloc(tmp,sizeof(long int*));
        for(i=0;i<tmp;i++)
                sum_hist[i]=(long int *)calloc(2,sizeof(long int));
       
        for(i=0;i<256;i++)
        {
                if(hist[i]!=0)
                {
                        sum_hist[sum][0]=(long int)i;
                        sum_hist[sum][1]=(long int)hist[i];
                        sum++;
                }
                else continue;
        }


        for(i=1;i<tmp;i++)
                sum_hist[i][1]+=sum_hist[i-1][1];


        min=sum_hist[0][1];
        max=sum_hist[0][1];
        for(i=1;i<tmp;i++)
                {
                        if(min>sum_hist[i][1])
                        min=sum_hist[i][1];
                        else continue;
                }
        for(i=1;i<tmp;i++)
                {
                        if(max<sum_hist[i][1])
                        max=sum_hist[i][1];
                        else continue;
                }

        p=((height*width)-min);

        for(i=0;i<height;i++)
        {
                for(j=0;width;j++)
                {
                        printf("%d\n",rgb1[i][j]);
                        delay(100);
                }
        }       
            for(i=0;i<height;i++)
        {
                for(j=0;j<width;j++)
                {
                        t=rgb1[i][j];
                        //printf("%d\n",t);
                        //delay(100);
                        for(i=0;i<tmp;i++)
                        {
                        if(sum_hist[i][0]==t)
                        index=sum_hist[i][1];
                        }
                        index=index-min;
                        rgb1[i][j]=abs(index*255/p);
                        //printf("%d %d\n",t,rgb1[i][j]);
                        //delay(100);       
                }
        }
        /*for(i=0;i<height;i++)
                {
                        for(j=0;j<width;j++)
                        drawdot(first_column+j,last_row-i,rgb1[i][j]);
                }*/
       
        _close(handle);
        getch();
        _AX=0x1201;_BL=0x33;geninterrupt(0x10);//don't add RGB
        _AX=0x0003;geninterrupt(0x10);//set mode 3 i.e. 16-color text

}

In the above code..I have two problems...
when assining the value of rgb1[][]..thn if i print the values..it is giving correct results..but if i try to print it outside the block..some garbage values are printed..
and no code is running beyond...
Code:

for(i=0;i<height;i++)
        {
                for(j=0;j<width;j++)
                {
                        t=rgb1[i][j];
                        //printf("%d\n",t);
                        //delay(100);
                        for(i=0;i<tmp;i++)
                        {
                        if(sum_hist[i][0]==t)
                        index=sum_hist[i][1];
                        }
                        index=index-min;
                        rgb1[i][j]=abs(index*255/p);
                        //printf("%d %d\n",t,rgb1[i][j]);
                        //delay(100);       
                }


hbilling 14Sep2008 17:34

Re: Help me out with this C code for histogram equalization
 
Hi,
I don't think i clearly understand ur issue!. But i see an issue here. You are using(or rather reusing) the variable 'i' in the loop.
Code:

for(i=0;i<height;i++)
        {
                for(j=0;j<width;j++)
                {
                        t=rgb1[i][j];
                        //printf("%d\n",t);
                        //delay(100);
                        for(i=0;i<tmp;i++) <<< Here u are using the same variable 'i' as the outer loop.
                                                    // You could use a new variable like 'inner_i' here. I guess thats what u actually intended to..
                        {
                        if(sum_hist[i][0]==t)
                        index=sum_hist[i][1];
                        }
                        index=index-min;
                        rgb1[i][j]=abs(index*255/p);
                        //printf("%d %d\n",t,rgb1[i][j]);
                        //delay(100);       
                }


oogabooga 14Sep2008 23:48

Re: Help me out with this C code for histogram equalization
 
This is obviously an old (16-bit?) piece of code you are trying to resurrect. Rarely a good idea. You should start fresh or at least find a more modern starting point.


All times are GMT +5.5. The time now is 10:28.