home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_300
/
343_02
/
hist.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-28
|
12KB
|
504 lines
/*****************************************************
*
* file d:\cips\hist.c
*
* Functions: This file contains
* calculate_histogram
* calculate_histogram
* zero_histogram
* perform_histogram_equalization
* show_histogram
* print_histogram
* smooth_histogram
*
*
* Purpose: These functions calculate and display the
* histogram of an input image array.
*
* Modifications:
* July 86 - ported to IBM-PC
* August 1990 - modified for use in the
* C Image Processing System
* March 1992 - removed the hardwired values
* of 100 and replaced them with ROWS
* and COLS. There are still some
* hardwired numbers in this file, but
* they deal with displaying a histogram.
*
*******************************************************/
#include "d:\cips\cips.h"
#define PRINT_WIDTH 80
#define FORMFEED '\014'
/*****************************************
*
* perform_histogram_equalization(...
*
******************************************/
perform_histogram_equalization(image, histogram, new_grays, area)
float new_grays, area;
short image[ROWS][COLS];
unsigned long histogram[];
{
int i,
j,
k;
unsigned long sum,
sum_of_h[256];
double constant;
sum = 0;
for(i=0; i<256; i++){
sum = sum + histogram[i];
sum_of_h[i] = sum;
}
/* constant = new # of gray levels div by area */
constant = new_grays/area;
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
k = image[i][j];
image[i][j] = sum_of_h[k] * constant;
}
}
} /* ends perform_histogram_equalization */
/*****************************************
*
* zero_histogram(...
*
******************************************/
zero_histogram(histogram)
unsigned long histogram[];
{
int i;
for(i=0; i<256; i++)
histogram[i] = 0;
} /* ends zero_histogram */
/*****************************************
*
* calcualte_histogram(...
*
******************************************/
calculate_histogram(image, histogram)
short image[ROWS][COLS];
unsigned long histogram[];
{
int i,j,k;
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
k = image[i][j];
histogram[k] = histogram[k] + 1;
}
}
} /* ends calculate_histogram */
/*********************************************
*
* show_histogram(histogram)
*
* This function shows the histogram
* on the screen as numbers and stars.
*
**********************************************/
show_histogram(histogram)
unsigned long histogram[];
{
int count,
i,
j;
unsigned long max, scale;
max = 0;
count = 0;
for(i=0; i<GRAY_LEVELS; i++)
if(histogram[i] > max)
max = histogram[i];
if(max > (70 - 12))
scale = max/(70 - 12);
else
scale = 1;
printf("\n max=%ld scale=%ld",max, scale);
printf("\n\ngray count");
printf("\nlevel");
for(i=0; i<256; i++){
if(histogram[i] == 0)
++count;
else
count = 0;
if(count < 2){
printf("\n %4d: %7ld",i,histogram[i]);
for(j=0; j<((int)(histogram[i]/scale)); j++){
printf("*");
} /* ends loop over j */
} /* ends if count < 5 */
} /* ends loop over i GRAY_LEVELS */
} /* ends show_histogram */
/*********************************************
*
* print_histogram(histogram)
*
* This function prints the histogram
* input to the function.
*
**********************************************/
print_histogram(histogram, name)
char name[];
unsigned long histogram[];
{
char string[300],
output[300];
int count,
i,
j,
line_counter,
print_counter;
unsigned long scale, max;
FILE *printer;
if( (printer = fopen("prn", "w")) == NULL)
printf("\nPH> Could not open printer");
else
printf("\nPH> The print file is opened");
max = 0;
count = 0;
print_counter = 0;
for(i=0; i<256; i++)
if(histogram[i] > max)
max = histogram[i];
if(max > (PRINT_WIDTH - 12))
scale = max/(PRINT_WIDTH - 12);
else
scale = 1;
printf("\n max=%ld scale=%ld",max, scale);
printf("\nPI> Print header");
line_counter = 0;
long_clear_buffer(string);
sprintf(string, " This image is -- %s --", name);
my_fwriteln(printer, string);
++line_counter;
long_clear_buffer(string);
sprintf(string, " ");
my_fwriteln(printer, string);
++line_counter;
long_clear_buffer(string);
sprintf(string, " gray count");
my_fwriteln(printer, string);
++line_counter;
long_clear_buffer(string);
sprintf(string, " level");
my_fwriteln(printer, string);
++line_counter;
for(i=0; i<256; i++){
if(histogram[i] == 0)
++count;
else
count = 0;
if(count < 2){
printf(" %4d: %7ld",i,histogram[i]);
print_counter++;
if(print_counter >= 6){
printf("\n");
print_counter = 0;
} /* ends if print_counter >= 6 */
long_clear_buffer(string);
sprintf(string,
" %3d: %7ld ->",i,histogram[i]);
my_fwrite(printer, string);
long_clear_buffer(string);
sprintf(output, " ");
for(j=0; j<((int)(histogram[i]/scale)); j++){
sprintf(string, "*");
append_string(string, output);
} /* ends loop over j */
my_fwriteln(printer, output);
++line_counter;
if(line_counter >= 55){
line_counter = 0;
putc(FORMFEED, printer);
} /* ends if line_counter >=55 */
} /* ends if count < 2 */
} /* ends loop over i */
putc(FORMFEED, printer);
fclose(printer);
} /* ends print_histogram */
/*********************************************
*
* display_histogram(histogram)
*
* This function shows the histogram
* input to the function.
*
**********************************************/
display_histogram(histogram, x, y,
line_color,data_color)
int data_color, line_color, x, y;
unsigned long histogram[];
{
int count,
i,
j,
length;
unsigned long scale, max;
max = 0;
count = 0;
for(i=0; i<256; i++)
if(histogram[i] > max)
max = histogram[i];
if(max > (300 - 12))
scale = max/(100 - 12);
else
scale = 1;
/***************************
*
* clear out an area for
* this histogram display
*
****************************/
_setcolor(0);
for(i=0; i<258; i++){
for(j=0; j<100; j++){
_setpixel(x-1+i, y-j);
}
}
/***************************
*
* loop thru the histogram
* and plot the scaled data
*
****************************/
_setlinestyle(0xFFFF);
_setcolor(data_color);
for(i=0; i<256; i++){
if(histogram[i] != 0){
length = histogram[i]/scale;
_moveto(x+i, y);
_lineto(x+i, y-length);
}
} /* ends loop over i GRAY_LEVELS */
/***************************
*
* draw the histogram
* axes
*
****************************/
_setcolor(line_color);
_moveto(x, y);
_lineto(x+255, y);
_moveto(x, y);
_lineto(x, y-5);
_moveto(x+50, y);
_lineto(x+50, y-5);
_moveto(x+100, y);
_lineto(x+100, y-5);
_moveto(x+150, y);
_lineto(x+150, y-5);
_moveto(x+200, y);
_lineto(x+200, y-5);
_moveto(x+255, y);
_lineto(x+255, y-5);
} /* ends display_histogram */
display_menu_for_histogram(print, vertical, horizontal)
int *print, *vertical, *horizontal;
{
char response[80];
int int_response, not_finished, r;
not_finished = 1;
while(not_finished){
printf("\n\nHISTOGRAM> Enter choice (0 for no change) ");
printf("\nHISTOGRAM> 1. print is %d (1=print 0=display)",
*print);
printf("\nHISTOGRAM> 2. # of vertical %dx%d areas %d",
ROWS,COLS,*vertical);
printf("\nHISTOGRAM> 3. # of horizontal %dx%d areas %d",
ROWS,COLS,*horizontal);
printf("\nHISTOGRAM> _\b");
get_integer(&r);
if(r == 0)
not_finished = 0;
if(r == 1){
printf(
"\nHISTOGRAM> Enter 1 for print or 0 for display");
printf("\nHISTOGRAM> ___");
get_integer(&int_response);
*print = int_response;
} /* ends if r == 1 */
if(r == 2){
printf(
"\nHISTOGRAM> Enter # of vertical %dx%d areas ",ROWS,COLS);
printf("\nHISTOGRAM> _\b");
get_integer(&int_response);
*vertical = int_response;
} /* ends if r == 2 */
if(r == 3){
printf(
"\nHISTOGRAM> Enter # of horizontal %dx%d areas ",ROWS,COLS);
printf("\nHISTOGRAM> ___");
get_integer(&int_response);
*horizontal = int_response;
} /* ends if r == 3 */
} /* ends while not_finished */
} /* ends display_menu */
calculate_area_histogram(histogram, vertical, horizontal,
the_image, name, il, ie, ll, le)
char name[];
int horizontal, il, ie, ll, le, vertical;
short the_image[ROWS][COLS];
unsigned long histogram[];
{
int count, i, j;
printf("\nCalculating histograms");
zero_histogram(histogram);
count = 1;
for(i=0; i<vertical; i++){
for(j=0; j<horizontal; j++){
printf("\n\tcalculating %d of %d",
count, horizontal*vertical);
read_tiff_image(name, the_image,
il+i*ROWS, ie+j*COLS, ll+i*ROWS, le+j*COLS);
calculate_histogram(the_image, histogram);
count++;
} /* ends loop over j */
} /* ends loop over i */
} /* calcualte_area_histogram */