public my_color[,] Linear_filter(ref my_color[,] the_image, ref float[,] the_mask, string _post_processing) { _image temp_image = new _image(); int mask_width = the_mask.GetLength(1); int mask_height = the_mask.GetLength(0); temp_image.image_buffer = pad_image(ref the_image, mask_width, mask_height); //MessageBox.Show("Now Image is padded in the Memory , here it is"); //display_image(temp_image.image_buffer); //padded and ready to be masked _image resulted_image = new _image(); resulted_image.image_buffer = new my_color[the_image.GetLength(0), the_image.GetLength(1)]; //Apply the choosed filter with the given mask int added_width = (int)((the_image.GetLength(1) - 1) / 2); int added_height = (int)((the_image.GetLength(0) - 1) / 2); int W = the_image.GetLength(1); int H = the_image.GetLength(0); double red_sum, green_sum, blue_sum; int Mask_width = the_image.GetLength(1); int Mask_hight = the_image.GetLength(0); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { red_sum = 0; green_sum = 0; blue_sum = 0; int current_pixel_width = j + added_width; int current_pixel_height = i + added_height; for (int current_height_of_pixel_padded = current_pixel_height - added_height, current_H_pixel_mask = 0; current_H_pixel_mask < mask_height; current_height_of_pixel_padded++, current_H_pixel_mask++) /////current_height_of_pixel_padded < current_pixel_height + added_height { for (int current_width_of_pixel_padded = current_pixel_width - added_width, current_W_pixel_mask = 0; current_W_pixel_mask < mask_width; current_width_of_pixel_padded++, current_W_pixel_mask++) ///// current_width_of_pixel_padded < current_pixel_width + added_width { red_sum += (double)temp_image.image_buffer[current_height_of_pixel_padded, current_width_of_pixel_padded].Red * (double)the_mask[current_H_pixel_mask, current_W_pixel_mask]; green_sum += (double)temp_image.image_buffer[current_height_of_pixel_padded, current_width_of_pixel_padded].Green * (double)the_mask[current_H_pixel_mask, current_W_pixel_mask]; blue_sum += (double)temp_image.image_buffer[current_height_of_pixel_padded, current_width_of_pixel_padded].Blue * (double)the_mask[current_H_pixel_mask, current_W_pixel_mask]; } } resulted_image.image_buffer[i, j].Red = (int)red_sum; resulted_image.image_buffer[i, j].Green = (int)green_sum; resulted_image.image_buffer[i, j].Blue = (int)blue_sum; } } //return resulted_image.image_buffer; return(Post_processing(resulted_image.image_buffer, _post_processing)); }
public my_color[,] pad_image(ref my_color[,] image1, int mask_width, int mask_height) { padded_image = new _image(); //Padding process : add borders to the image , new size then //needed variables int old_width, old_hight, new_width, new_hight, added_width_size, added_height_size; old_width = image1.GetLength(1); old_hight = image1.GetLength(0); new_width = old_width + mask_width - 1; new_hight = old_hight + mask_height - 1; padded_image.image_buffer = new my_color[(new_hight), (new_width)]; added_width_size = (int)((mask_width - 1) / 2); added_height_size = (int)((mask_height - 1) / 2); for (int i = 0; i < new_hight; i++) { for (int j = 0; j < new_width; j++) { if (j < added_width_size || i < added_height_size) { padded_image.image_buffer[i, j].Red = 0; padded_image.image_buffer[i, j].Green = 0; padded_image.image_buffer[i, j].Blue = 0; } else if (j >= (old_width + added_width_size) || i >= (old_hight + added_height_size)) { padded_image.image_buffer[i, j].Red = 0; padded_image.image_buffer[i, j].Green = 0; padded_image.image_buffer[i, j].Blue = 0; } else { padded_image.image_buffer[i, j].Red = image1[(i - added_height_size), (j - added_width_size)].Red; padded_image.image_buffer[i, j].Green = image1[(i - added_height_size), (j - added_width_size)].Green; padded_image.image_buffer[i, j].Blue = image1[(i - added_height_size), (j - added_width_size)].Blue; } } } return(padded_image.image_buffer); }