#include #include #include #include #define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #include #include #include #include #include "scolor.h" unsigned char mortar_threshold = 160; size_t array_length; unsigned char *image; int width, height; pthread_mutex_t tge_mutex = PTHREAD_MUTEX_INITIALIZER; unsigned long total_green_extra = 0; struct limits { size_t start; size_t stop; }; void* apply_filter(void* p){ struct limits *l = p; size_t center_x = width/2, center_y = height/2; unsigned long tge_local = 0; printf("Starting at %lu, stopping at %lu\n", l->start, l->stop); for(size_t i = l->start; i < l->stop; i += 3){ unsigned char red = image[i]; unsigned char green = image[i + 1]; unsigned char blue = image[i + 2]; unsigned char rb_average = (red / 2 + blue / 2); unsigned char green_extra = 0; if(green > rb_average) green_extra = green - rb_average; tge_local += green_extra; } pthread_mutex_lock(&tge_mutex); total_green_extra += tge_local; pthread_mutex_unlock(&tge_mutex); } double timediff(struct timeval* start, struct timeval* end) { double s_diff = end->tv_sec - start->tv_sec; double us_diff = end->tv_usec - start->tv_usec; s_diff += us_diff / 1000000; return s_diff; } int main(int argc, char ** argv){ if(argc == 1) image = stbi_load("brick.jpg", &width, &height, 0, 3); else { image = stbi_load(argv[1], &width, &height, 0, 3); if(!image){ printf(RED("%s: Did not load\n"), argv[1]); return 1; } } array_length = width * height * 3; // 3 channels if(!image) puts(RED("No image, giving up!")); else printf(PURPLE("Image size: %d by %d\n"), width, height); struct timeval start, end; gettimeofday(&start, NULL); int thread_count = 32; pthread_t threads[thread_count]; struct limits parameters[thread_count]; for(int i = 0; i < thread_count; i++){ parameters[i].start = i * (array_length / thread_count); parameters[i].stop = (i + 1) * (array_length / thread_count); pthread_create(&threads[i], 0, apply_filter, ¶meters[i]); } for(int i = 0; i < thread_count; i++){ pthread_join(threads[i], 0); } gettimeofday(&end, NULL); printf("Green count time: %lf\n", timediff(&start, &end)); printf(DGREEN("Total Green Extra: ")DBLUE(" %lu\n"), total_green_extra); printf(DGREEN("Greenness Score: ")DBLUE(" %.2lf\n"), (double)total_green_extra / (width * height)); return 0; }