Team Gryffindor: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
Line 78: | Line 78: | ||
[[Image:Lena_sobel.jpg|200px|thumb|left|alt text]] | [[Image:Lena_sobel.jpg|200px|thumb|left|alt text]] | ||
=== Assignment #2 (New Algorithm)=== | |||
[http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm Description of Sobel's Algorithm] - This is a great website teachs us how it works, and it also provide some examples, which help us to implement in C code. | |||
Compiler: | |||
gcc -O -lm sobel.c -o sobel | |||
./sobel | |||
Sobel edge detection algorithm code with C (''Since the code is very long, I just show key part of algorithm''): | |||
/* sobel.c */ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <float.h> | |||
#include "mypgm.h" | |||
#include <math.h> | |||
void sobel_filtering( ) | |||
/* Spatial filtering of image data */ | |||
/* Sobel filter (horizontal differentiation */ | |||
/* Input: image1[y][x] ---- Outout: image2[y][x] */ | |||
{ | |||
/* Definition of Sobel filter in horizontal direction */ | |||
int maskx[3][3] = {{-1,0,1},{-2,0,2},{-1,0,1}}; | |||
int masky[3][3] = {{1,2,1},{0,0,0},{-1,-2,-1}}; | |||
double pixel_value_x, pixel_value_y, pixel_value; | |||
double min, max; | |||
int x, y, i, j; /* Loop variable */ | |||
/* Initialization of image2[y][x] */ | |||
x_size2 = x_size1; | |||
y_size2 = y_size1; | |||
for (y = 0; y < y_size2; y++) { | |||
for (x = 0; x < x_size2; x++) { | |||
image2[y][x] = 0; | |||
} | |||
} | |||
/* Generation of image2 after linear transformtion */ | |||
for (y = 1; y < y_size1 - 1; y++) { | |||
for (x = 1; x < x_size1 - 1; x++) { | |||
pixel_value_x = 0.0; | |||
pixel_value_y = 0.0; | |||
for (j = -1; j <= 1; j++) { | |||
for (i = -1; i <= 1; i++) { | |||
pixel_value_x += image1[y+j][x+i] * maskx[j+1][i+1]; | |||
pixel_value_y += image1[y+j][x+i] * masky[j+1][i+1]; | |||
} | |||
pixel_value = (abs(pixel_value_x)+abs(pixel_value_y)); //To make it better to implement on hardware, we approximate the magnitude | |||
if (pixel_value >= 255)pixel_value=255; | |||
if (pixel_value <= 0)pixel_value=0; | |||
image2[y][x] = (unsigned char)pixel_value; | |||
} | |||
} | |||
} | |||
} | |||
main( ) | |||
{ | |||
load_image_data( ); /* Input of image1 */ | |||
sobel_filtering( ); /* Sobel filter is applied to image1 */ | |||
save_image_data( ); /* Output of image2 */ | |||
return 0; | |||
} | |||
== Profiling Sobel edge detection algorithm == | == Profiling Sobel edge detection algorithm == |
Revision as of 02:56, 15 February 2012
Error creating thumbnail: File missing | |||||
Gryffindor Team Logo | |||||
---|---|---|---|---|---|
|
Assignment #2
Description of Sobel's Algorithm - This is a great website teachs us how it works, and it also provide some examples, which help us to implement in C code.
Compiler:
gcc -O -lm sobel.c -o sobel
./sobel
Sobel edge detection algorithm code with C (Since the code is very long, I just show key part of algorithm):
int sobel(double threshold) { unsigned int x, y, i, v, u; // for loop counter unsigned char R, G, B; // color of R, G, B double val[MASK_N] = {0.0}; int adjustX, adjustY, xBound, yBound; double total; for(y = 0; y != height; ++y) { for(x = 0; x != width; ++x) { for(i = 0; i != MASK_N; ++i) { adjustX = (MASK_X % 2) ? 1 : 0; adjustY = (MASK_Y % 2) ? 1 : 0; xBound = MASK_X / 2; yBound = MASK_Y / 2; val[i] = 0.0; for(v = -yBound; v != yBound + adjustY; ++v) { for (u = -xBound; u != xBound + adjustX; ++u) { if (x + u >= 0 && x + u < width && y + v >= 0 && y + v < height) { R = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 2); G = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 1); B = *(image_s + byte_per_pixel * (width * (y+v) + (x+u)) + 0); val[i] += color_to_int(R, G, B) * mask[i][u + xBound][v + yBound]; } } } } total = 0.0; for (i = 0; i != MASK_N; ++i) { total += val[i] * val[i]; } total = sqrt(total); if (total - threshold >= 0) { // black *(image_t + byte_per_pixel * (width * y + x) + 2) = BLACK; *(image_t + byte_per_pixel * (width * y + x) + 1) = BLACK; *(image_t + byte_per_pixel * (width * y + x) + 0) = BLACK; } else { // white *(image_t + byte_per_pixel * (width * y + x) + 2) = WHITE; *(image_t + byte_per_pixel * (width * y + x) + 1) = WHITE; *(image_t + byte_per_pixel * (width * y + x) + 0) = WHITE; } } } return 0; }
We use color lena with 24bit bmp file
Assignment #2 (New Algorithm)
Description of Sobel's Algorithm - This is a great website teachs us how it works, and it also provide some examples, which help us to implement in C code.
Compiler:
gcc -O -lm sobel.c -o sobel
./sobel
Sobel edge detection algorithm code with C (Since the code is very long, I just show key part of algorithm):
/* sobel.c */
- include <stdio.h>
- include <stdlib.h>
- include <float.h>
- include "mypgm.h"
- include <math.h>
void sobel_filtering( )
/* Spatial filtering of image data */ /* Sobel filter (horizontal differentiation */ /* Input: image1[y][x] ---- Outout: image2[y][x] */
{
/* Definition of Sobel filter in horizontal direction */
int maskx[3][3] = {{-1,0,1},{-2,0,2},{-1,0,1}}; int masky[3][3] = {{1,2,1},{0,0,0},{-1,-2,-1}}; double pixel_value_x, pixel_value_y, pixel_value; double min, max; int x, y, i, j; /* Loop variable */
/* Initialization of image2[y][x] */ x_size2 = x_size1; y_size2 = y_size1; for (y = 0; y < y_size2; y++) { for (x = 0; x < x_size2; x++) { image2[y][x] = 0; } } /* Generation of image2 after linear transformtion */ for (y = 1; y < y_size1 - 1; y++) { for (x = 1; x < x_size1 - 1; x++) { pixel_value_x = 0.0; pixel_value_y = 0.0; for (j = -1; j <= 1; j++) {
for (i = -1; i <= 1; i++) {
pixel_value_x += image1[y+j][x+i] * maskx[j+1][i+1]; pixel_value_y += image1[y+j][x+i] * masky[j+1][i+1];
}
pixel_value = (abs(pixel_value_x)+abs(pixel_value_y)); //To make it better to implement on hardware, we approximate the magnitude
if (pixel_value >= 255)pixel_value=255; if (pixel_value <= 0)pixel_value=0;
image2[y][x] = (unsigned char)pixel_value; } }
}
}
main( ) {
load_image_data( ); /* Input of image1 */ sobel_filtering( ); /* Sobel filter is applied to image1 */ save_image_data( ); /* Output of image2 */ return 0;
}
Profiling Sobel edge detection algorithm
This command will generate a test file:
gcc -lm -pg sobel.c ./a.out gprof a.out > test
test file:
% cumulative self self total 80.80 0.15 0.15 1 145.44 175.53 sobel 16.72 0.18 0.03 4706312 0.00 0.00 color_to_int 0.00 0.18 0.00 1 0.00 0.00 read_bmp 0.00 0.18 0.00 1 0.00 0.00 write_bmp