Image Processing 391
}33
// detect edges and save the edges in the image34
pxl = 0;35
for ( row = 0; row < height ; row ++)36
{37
pxl += 3; // skip the first pixel in each row38
for ( col = 1; col < width ; col ++)39
{40
int diff = twoDGray [ row ][ col ] -41
twoDGray [ row ][ col - 1];42
// take the absolute value43
i f ( diff < 0)44
{45
diff = - diff ;46
}47
i f ( diff > thrshd ) // an edge48
{49
// set color to white50
img -> data [ pxl + 2] = 255;51
img -> data [ pxl + 1] = 255;52
img -> data [ pxl ] = 255;53
}54
e l s e // not an edge55
{56
// set color to black57
img -> data [ pxl + 2] = 0;58
img -> data [ pxl + 1] = 0;59
img -> data [ pxl ] = 0;60
}61
pxl += 3;62
}63
}64
for ( row = 0; row < height ; row ++)65
{66
free ( twoDGray [ row ]) ;67
}68
free ( twoDGray );69
}70
23.2.6 Color Equalization
Sometimes an image is over exposed (too bright) or under exposed (too dark). The image
can usually be enhanced by using color equalization using the following steps:
1. Find the maximum and the minimum values of the colors.
2. If the maximum and the minimum values are different, scale the maximum value to
255 and the minimum value to 0.
3. Scale the color based on a formula.
There are many ways to scale the pixel’s colors. One simple method is called linear
scaling: using a linear equation to express the relationship between the original color and
392 Intermediate C Programming
the new color. Let x and y be the old and the new colors, then a linear equation has two
coefficients: a and b.
y = ax + b (23.1)
Suppose M and m are the original minimum and the maximum values. They should
become 0 and 255 after the scaling. The following two equations are used to determine the
correct values for a and b.
0 = am + b
255 = aM + b
(23.2)
a =
255
M m
and b =
255m
M m
(23.3)
The code listing below implements this color equalization scheme.
// bm p equalize . c1
#in clude " bmpfunc . h"2
void BMP_eq ualize ( B MP_Image * img )3
{4
int pxl ;5
unsigned char redmin = 255;6
unsigned char redmax = 0;7
unsigned char greenmin = 255;8
unsigned char greenmax = 0;9
unsigned char bluemin = 255;10
unsigned char bluemax = 0;11
// find the maximum and the minimum values of each color12
for ( pxl = 0; pxl < ( img -> data_ size ) ; pxl += 3)13
{14
unsigned char red = img -> data [ pxl + 2];15
unsigned char green = img -> data [ pxl + 1];16
unsigned char blue = img -> data [ pxl ];17
i f ( redmin > red ) { redmin = red ; }18
i f ( redmax < red ) { redmax = red ; }19
i f ( greenmi n > green ) { greenmin = green ; }20
i f ( greenma x < green ) { greenmax = green ; }21
i f ( bluemin > blue ) { bluemin = blue ; }22
i f ( bluemax < blue ) { bluemax = blue ; }23
}24
// calc ulate the scaling factors25
// max and min must be d ifferent to prevent26
// divided by zero error27
double r edscale = 1.0;28
double greensca l e = 1.0;29
double bluescale = 1.0;30
i f ( redmax > redmin )31
{32
redscale = 255.0 / ( redmax - redmin ) ;33
}34
i f ( greenma x > green m in )35
{36
Image Processing 393
greensc a le = 255.0 / ( greenmax - green m i n );37
}38
i f ( bluemax > bluemin )39
{40
bluescale = 255.0 / ( bluemax - bluemin );41
}42
43
// equaliz e the pixels44
for ( pxl = 0; pxl < ( img -> data_ size ) ; pxl += 3)45
{46
i f ( redmax > redmin )47
{48
img -> data [ pxl + 2] = ( in t ) ( redscale *49
( img -> data [ pxl + 2] - redmin ) );50
}51
i f ( greenma x > green m in )52
{53
img -> data [ pxl + 1] = ( in t ) ( greens cale *54
( img -> data [ pxl + 1] - greenm i n ) );55
}56
i f ( bluemax > bluemin )57
{58
img -> data [ pxl ] = ( i n t ) ( bluesca le *59
( img -> data [ pxl ] - bluemin )) ;60
}61
}62
}63
This chapter gives a starting point for image processing. Image processing is a rich
subject and there are many books on the topic and related topics.
This page intentionally left blankThis page intentionally left blank
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset