int main(int argv, char** argc) { printf("\n\nRunning code for question 1.11:\n\n"); int train_area1[4] = {150-1,330-1,264-1,328-1}; /*read images from file*/ pnm_img * kande1 = pnm_read(IMG_IN_DIR "kande1.pnm"), * kande2 = pnm_read(IMG_IN_DIR "kande2.pnm"); pnm_img * train_img =pnm_subimage(kande1, train_area1); mtrx * train_set = img2train_set(train_img); vect * s_mean = sample_mean(train_set); mtrx * s_cov = sample_cov(train_set, s_mean); double* map = (double*)malloc(kande2->width*kande2->height*sizeof(double)); pdf_map(kande2, s_mean,s_cov,&map); vect* w_mean = weighted_avg_pos(kande2, map); pnm_pixmap p = {0,255,0}; for (int x = -2; x<4; x++) for (int y=-2; y<4; y++) { pnm_set_pixel(kande2, (*w_mean->data)+x, *(w_mean->data+1)+y, &p); } // pnm_write(kande1, IMG_OUT_DIR"cas10center.pnm"); mtrx* w_cov = weighted_2dcov(map, w_mean, kande2); FILE* fp = fopen(TEX_OUT_DIR"c11.tex", "w"); vect2tex(w_mean, "celevenwmean", fp); mtrx2tex(w_cov, "celevenwcov", fp); fclose(fp); gplot_img2splot(kande2, 0 ,TEX_OUT_DIR"case11.kande2.gnuplot.dat"); gplot_pdf2splot(w_mean, w_cov, kande2, 5, TEX_OUT_DIR"case11.pdf.gnuplot.dat"); gsl_matrix_free(train_set); gsl_matrix_free(s_cov); gsl_vector_free(s_mean); pnm_destroy(kande1); pnm_destroy(train_img); }
image_u8_t *image_u8_copy(const image_u8_t *in) { uint8_t *buf = malloc(in->height*in->stride*sizeof(uint8_t)); memcpy(buf, in->buf, in->height*in->stride*sizeof(uint8_t)); // const initializer image_u8_t tmp = { .width = in->width, .height = in->height, .stride = in->stride, .buf = buf }; image_u8_t *copy = calloc(1, sizeof(image_u8_t)); memcpy(copy, &tmp, sizeof(image_u8_t)); return copy; } void image_u8_destroy(image_u8_t *im) { if (!im) return; free(im->buf); free(im); } //////////////////////////////////////////////////////////// // PNM file i/o image_u8_t *image_u8_create_from_pnm(const char *path) { pnm_t *pnm = pnm_create_from_file(path); if (pnm == NULL) return NULL; image_u8_t *im = NULL; switch (pnm->format) { case PNM_FORMAT_GRAY: { im = image_u8_create(pnm->width, pnm->height); for (int y = 0; y < im->height; y++) memcpy(&im->buf[y*im->stride], &pnm->buf[y*im->width], im->width); break; } case PNM_FORMAT_RGB: { im = image_u8_create(pnm->width, pnm->height); // Gray conversion for RGB is gray = (r + g + g + b)/4 for (int y = 0; y < im->height; y++) { for (int x = 0; x < im->width; x++) { uint8_t gray = (pnm->buf[y*im->width*3 + 3*x+0] + // r pnm->buf[y*im->width*3 + 3*x+1] + // g pnm->buf[y*im->width*3 + 3*x+1] + // g pnm->buf[y*im->width*3 + 3*x+2]) // b / 4; im->buf[y*im->stride + x] = gray; } } break; } } pnm_destroy(pnm); return im; }