1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Help me out with this C code for histogram equalization

Discussion in 'C' started by getbiplab, Sep 14, 2008.

  1. getbiplab

    getbiplab New Member

    Joined:
    Sep 8, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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);	
    		}
     
    Last edited by a moderator: Sep 14, 2008
  2. hbilling

    hbilling New Member

    Joined:
    Aug 30, 2008
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    0
    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);	
    		}
     
    Last edited by a moderator: Sep 14, 2008
  3. oogabooga

    oogabooga New Member

    Joined:
    Jan 9, 2008
    Messages:
    115
    Likes Received:
    11
    Trophy Points:
    0
    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.
     

Share This Page