diff --git a/part_1/image.cu b/part_1/image.cu index c77c4080a803ba691effacac99664347249b023f..38899be3c34b1d1c00ca061cff767b099ae3fec0 100644 --- a/part_1/image.cu +++ b/part_1/image.cu @@ -95,6 +95,7 @@ __global__ void cuda_convolution_blur( // Only proceed if GPU thread corresponds to a pixel in the image. Ignore all extra threads. if (pixel_index <= total_pixels) { + // printf("total_pixels: %ld pixel_index: %ld\n", total_pixels, pixel_index); // Calculate pixel location data. int image_row = (pixel_index / image_width) % image_height; @@ -112,8 +113,8 @@ __global__ void cuda_convolution_blur( int row_far_top = image_mid_row - mask_mid_row; int row_far_bot = image_mid_row + mask_mid_row; - // For now, only compute on pixel in center of image. - if ((image_row == image_mid_row) && (image_col == image_mid_col)) { + // // For now, only compute on pixel in center of image. + // if ((image_row == image_mid_row) && (image_col == image_mid_col)) { // printf("\n\n"); // printf("total_pixels: %ld image_width: %d image_height: %d\n", total_pixels, image_width, image_height); // printf("Middle pixel found: %ld image_col: %d image_row: %d\n", pixel_index, image_col, image_row); @@ -169,6 +170,9 @@ __global__ void cuda_convolution_blur( float convolution_total_r = 0.f; float convolution_total_g = 0.f; float convolution_total_b = 0.f; + float convolution_weight_total_r = 0.f; + float convolution_weight_total_g = 0.f; + float convolution_weight_total_b = 0.f; int convolution_counter = 0; int mask_index = 0; for (int row_index = row_far_top; row_index <= row_far_bot; row_index++) { @@ -178,45 +182,89 @@ __global__ void cuda_convolution_blur( if ( ( (col_index >= 0) && (col_index < image_width) ) && ( (row_index >= 0) && (row_index < image_height) ) ) { int arr_index = col_index + (row_index * image_width); - // int a = col_index; - // int b = row_index; - // int c = a + (b * image_width); - // printf(" [%d,%d] (%d) (%f,%f,%f)", a, b, c, pixel_arr[mask_index].r, pixel_arr[mask_index].g, pixel_arr[mask_index].b); + // // // int a = col_index; + // // // int b = row_index; + // // // int c = a + (b * image_width); + // // // printf(" [%d,%d] (%d) (%f,%f,%f)", a, b, c, pixel_arr[mask_index].r, pixel_arr[mask_index].g, pixel_arr[mask_index].b); convolution_total_r += pixel_arr_orig[arr_index].r * mask_arr[mask_index].r; convolution_total_g += pixel_arr_orig[arr_index].g * mask_arr[mask_index].g; convolution_total_b += pixel_arr_orig[arr_index].b * mask_arr[mask_index].b; convolution_counter += 1; - // float red = pixel_arr_orig[arr_index].r * mask_arr[mask_index].r; - // float green = pixel_arr_orig[arr_index].g * mask_arr[mask_index].g; - // float blue = pixel_arr_orig[arr_index].b * mask_arr[mask_index].b; - // pixel_arr[arr_index].r = red; - // pixel_arr[arr_index].g = green; - // pixel_arr[arr_index].b = blue; + + if ( (col_index == image_mid_col) && (row_index == image_mid_row) ) { + + // float mask_inverse = 1.f - mask_arr[mask_index].r; + // float updated_r = pixel_arr_orig[arr_index].r * mask_arr[mask_index].r; + // float updated_inv_r = pixel_arr_orig[pixel_index].r * mask_inverse; + // printf("[%d,%d] orig_r: %f mask_weight: %f mask_inv: %f\n", col_index, row_index, pixel_arr_orig[arr_index].r, mask_arr[mask_index].r, mask_inverse); + // printf("updated_r: %f updated_inv_r: %f\n", updated_r, updated_inv_r); + // updated_r = updated_r + updated_inv_r; + // // printf("total_pixels: %ld pixel_index: %ld mask_index: %d\n", total_pixels, pixel_index, mask_index); + // printf("updated_r: %f\n", updated_r); + // // printf("[%d,%d] orig_r: %f mask_weight: %f mask_inv: %f new_r: %f\n", col_index, row_index, pixel_arr_orig[arr_index].r, mask_arr[mask_index].r, mask_inverse, updated_r); + + + + } + + // Calculate updated red value. + float mask_inverse = 1.f - mask_arr[mask_index].r; + float updated_pix = pixel_arr_orig[arr_index].r * mask_arr[mask_index].r; + float updated_inv_pix = pixel_arr_orig[pixel_index].r * mask_inverse; + convolution_total_r = convolution_total_r + updated_pix + updated_inv_pix; + convolution_weight_total_r += mask_arr[mask_index].r; + + // Calculate updated green value. + mask_inverse = 1.f - mask_arr[mask_index].g; + updated_pix = pixel_arr_orig[arr_index].g * mask_arr[mask_index].g; + updated_inv_pix = pixel_arr_orig[pixel_index].g * mask_inverse; + convolution_total_g = convolution_total_g + updated_pix + updated_inv_pix; + convolution_weight_total_g += mask_arr[mask_index].g; + + // Calculate updated blue value. + mask_inverse = 1.f - mask_arr[mask_index].b; + updated_pix = pixel_arr_orig[arr_index].b * mask_arr[mask_index].b; + updated_inv_pix = pixel_arr_orig[pixel_index].b * mask_inverse; + convolution_total_b = convolution_total_b + updated_pix + updated_inv_pix; + convolution_weight_total_b += mask_arr[mask_index].b; + + + // // float red = pixel_arr_orig[arr_index].r * mask_arr[mask_index].r; + // // float green = pixel_arr_orig[arr_index].g * mask_arr[mask_index].g; + // // float blue = pixel_arr_orig[arr_index].b * mask_arr[mask_index].b; + // // pixel_arr[arr_index].r = red; + // // pixel_arr[arr_index].g = green; + // // pixel_arr[arr_index].b = blue; } + mask_index += 1; } - mask_index += 1; // printf("\n"); } // Average out values and apply to pixel index. if (convolution_total_r > 0.f) { pixel_arr[pixel_index].r = (convolution_total_r / convolution_counter); + // pixel_arr[pixel_index].r = (1.f / convolution_weight_total_r) * convolution_total_r; } else { pixel_arr[pixel_index].r = 0.f; } if (convolution_total_g > 0.f) { pixel_arr[pixel_index].g = (convolution_total_g / convolution_counter); + // pixel_arr[pixel_index].g = (1.f / convolution_weight_total_g) * convolution_total_g; } else { pixel_arr[pixel_index].g = 0.f; } if (convolution_total_b > 0.f) { pixel_arr[pixel_index].b = (convolution_total_b / convolution_counter); + // pixel_arr[pixel_index].b = (1 / convolution_weight_total_b) * convolution_total_b; } else { pixel_arr[pixel_index].b = 0.f; } - } + + // printf("\n\n"); + // } } } @@ -556,12 +604,14 @@ void Image::compute() { // Found via much struggling and trial + error. float mask_col_adj = 1.f / (mask_middle_col + 1); float mask_row_adj = 1.f / (mask_middle_row + 1); - printf("mask_middle_col: %d mask_middle_row: %d\n", mask_middle_col, mask_middle_row); - printf("mask_col_adj: %f mask_row_adj: %f\n", mask_col_adj, mask_row_adj); + // printf("mask_middle_col: %d mask_middle_row: %d\n", mask_middle_col, mask_middle_row); + // printf("mask_col_adj: %f mask_row_adj: %f\n", mask_col_adj, mask_row_adj); unsigned long mask_total_pixels = mask_width * mask_height; unsigned long mask_struct_byte_count = mask_total_pixels * pixel_struct_size; // Initialize mask and set weights. + // printf("\n\n"); + logger.info("Mask size: " + std::to_string(mask_width) + "x" + std::to_string(mask_height)); PixelStruct* mask_arr = new PixelStruct[mask_total_pixels]; for (int mask_row_index = 0; mask_row_index < mask_height; mask_row_index++) { for (int mask_col_index = 0; mask_col_index < mask_width; mask_col_index++) { @@ -573,18 +623,22 @@ void Image::compute() { float mask_row_weight = (fabs(mask_middle_row - fabs(mask_middle_row - mask_row_index)) + 1) * mask_row_adj; // Calculate overall index weight, based on combination of individual dimension weights. - float index_weight = mask_col_weight * mask_row_weight; + float index_weight = (mask_col_weight * mask_row_weight); // printf(" [%d, %d] (%d) (%f,%f) ", mask_col_index, mask_row_index, mask_index, mask_col_weight, mask_row_weight); - printf(" [%d, %d] (%d) (%f) ", mask_col_index, mask_row_index, mask_index, index_weight); + // printf(" [%d, %d] (%d) (%f) ", mask_col_index, mask_row_index, mask_index, index_weight); // Finally, set mask index values. mask_arr[mask_index].r = index_weight; mask_arr[mask_index].g = index_weight; mask_arr[mask_index].b = index_weight; + // mask_arr[mask_index].r = 1.f; + // mask_arr[mask_index].g = 1.f; + // mask_arr[mask_index].b = 1.f; } - printf("\n"); + // printf("\n"); } + // printf("\n\n"); // Allocate memory on GPU. PixelStruct* gpu_pixel_arr;