| | |
| | | int j = ceil(ratio); |
| | | ratio -= i; |
| | | float r = (1-ratio) * colors[i][c] + ratio*colors[j][c]; |
| | | printf("%f\n", r); |
| | | //printf("%f\n", r); |
| | | return r; |
| | | } |
| | | |
| | |
| | | return out; |
| | | } |
| | | |
| | | // Returns a new image that is a cropped version (rectangular cut-out) |
| | | // of the original image. |
| | | IplImage* cropImage(const IplImage *img, const CvRect region) |
| | | { |
| | | IplImage *imageCropped; |
| | | CvSize size; |
| | | |
| | | if (img->width <= 0 || img->height <= 0 |
| | | || region.width <= 0 || region.height <= 0) { |
| | | //cerr << "ERROR in cropImage(): invalid dimensions." << endl; |
| | | exit(1); |
| | | } |
| | | |
| | | if (img->depth != IPL_DEPTH_8U) { |
| | | //cerr << "ERROR in cropImage(): image depth is not 8." << endl; |
| | | exit(1); |
| | | } |
| | | |
| | | // Set the desired region of interest. |
| | | cvSetImageROI((IplImage*)img, region); |
| | | // Copy region of interest into a new iplImage and return it. |
| | | size.width = region.width; |
| | | size.height = region.height; |
| | | imageCropped = cvCreateImage(size, IPL_DEPTH_8U, img->nChannels); |
| | | cvCopy(img, imageCropped,NULL); // Copy just the region. |
| | | |
| | | return imageCropped; |
| | | } |
| | | |
| | | // Creates a new image copy that is of a desired size. The aspect ratio will |
| | | // be kept constant if 'keepAspectRatio' is true, by cropping undesired parts |
| | | // so that only pixels of the original image are shown, instead of adding |
| | | // extra blank space. |
| | | // Remember to free the new image later. |
| | | IplImage* resizeImage(const IplImage *origImg, int newHeight, int newWidth, |
| | | int keepAspectRatio) |
| | | { |
| | | IplImage *outImg = 0; |
| | | int origWidth = 0; |
| | | int origHeight = 0; |
| | | if (origImg) { |
| | | origWidth = origImg->width; |
| | | origHeight = origImg->height; |
| | | } |
| | | if (newWidth <= 0 || newHeight <= 0 || origImg == 0 |
| | | || origWidth <= 0 || origHeight <= 0) { |
| | | //cerr << "ERROR: Bad desired image size of " << newWidth |
| | | // << "x" << newHeight << " in resizeImage().\n"; |
| | | exit(1); |
| | | } |
| | | |
| | | if (keepAspectRatio) { |
| | | // Resize the image without changing its aspect ratio, |
| | | // by cropping off the edges and enlarging the middle section. |
| | | CvRect r; |
| | | // input aspect ratio |
| | | float origAspect = (origWidth / (float)origHeight); |
| | | // output aspect ratio |
| | | float newAspect = (newWidth / (float)newHeight); |
| | | // crop width to be origHeight * newAspect |
| | | if (origAspect > newAspect) { |
| | | int tw = (origHeight * newWidth) / newHeight; |
| | | r = cvRect((origWidth - tw)/2, 0, tw, origHeight); |
| | | } |
| | | else { // crop height to be origWidth / newAspect |
| | | int th = (origWidth * newHeight) / newWidth; |
| | | r = cvRect(0, (origHeight - th)/2, origWidth, th); |
| | | } |
| | | IplImage *croppedImg = cropImage(origImg, r); |
| | | |
| | | // Call this function again, with the new aspect ratio image. |
| | | // Will do a scaled image resize with the correct aspect ratio. |
| | | outImg = resizeImage(croppedImg, newHeight, newWidth, 0); |
| | | cvReleaseImage( &croppedImg ); |
| | | } |
| | | else { |
| | | |
| | | // Scale the image to the new dimensions, |
| | | // even if the aspect ratio will be changed. |
| | | outImg = cvCreateImage(cvSize(newWidth, newHeight), |
| | | origImg->depth, origImg->nChannels); |
| | | if (newWidth > origImg->width && newHeight > origImg->height) { |
| | | // Make the image larger |
| | | cvResetImageROI((IplImage*)origImg); |
| | | // CV_INTER_LINEAR: good at enlarging. |
| | | // CV_INTER_CUBIC: good at enlarging. |
| | | cvResize(origImg, outImg, CV_INTER_LINEAR); |
| | | } |
| | | else { |
| | | // Make the image smaller |
| | | cvResetImageROI((IplImage*)origImg); |
| | | // CV_INTER_AREA: good at shrinking (decimation) only. |
| | | cvResize(origImg, outImg, CV_INTER_AREA); |
| | | } |
| | | |
| | | } |
| | | return outImg; |
| | | } |
| | | |
| | | image ipl_to_image(IplImage* src) |
| | | { |
| | | unsigned char *data = (unsigned char *)src->imageData; |
| | |
| | | return out; |
| | | } |
| | | |
| | | image crop_image(image im, int dr, int dc, int h, int w) |
| | | { |
| | | image cropped = make_image(h, w, im.c); |
| | | int i, j, k; |
| | | for(k = 0; k < im.c; ++k){ |
| | | for(j = 0; j < h; ++j){ |
| | | for(i = 0; i < w; ++i){ |
| | | int r = j + dr; |
| | | int c = i + dc; |
| | | float val = 128; |
| | | if (r >= 0 && r < im.h && c >= 0 && c < im.w) { |
| | | val = get_pixel(im, r, c, k); |
| | | } |
| | | set_pixel(cropped, j, i, k, val); |
| | | } |
| | | } |
| | | } |
| | | return cropped; |
| | | } |
| | | |
| | | // #wikipedia |
| | | image resize_image(image im, int h, int w) |
| | | { |
| | | image resized = make_image(h, w, im.c); |
| | | int r, c, k; |
| | | float h_scale = (float)(im.h - 1) / (h - 1) - .00001; |
| | | float w_scale = (float)(im.w - 1) / (w - 1) - .00001; |
| | | for(k = 0; k < im.c; ++k){ |
| | | for(r = 0; r < h; ++r){ |
| | | for(c = 0; c < w; ++c){ |
| | | float sr = r*h_scale; |
| | | float sc = c*w_scale; |
| | | int ir = (int)sr; |
| | | int ic = (int)sc; |
| | | float x = sr-ir; |
| | | float y = sc-ic; |
| | | float val = (1-x) * (1-y) * get_pixel(im, ir, ic, k) + |
| | | x * (1-y) * get_pixel(im, ir+1, ic, k) + |
| | | (1-x) * y * get_pixel(im, ir, ic+1, k) + |
| | | x * y * get_pixel(im, ir+1, ic+1, k); |
| | | set_pixel(resized, r, c, k, val); |
| | | } |
| | | } |
| | | } |
| | | return resized; |
| | | } |
| | | |
| | | void test_resize(char *filename) |
| | | { |
| | | image im = load_image(filename, 0,0); |
| | | image small = resize_image(im, 63, 65); |
| | | image big = resize_image(im, 512, 513); |
| | | image crop = crop_image(im, 10, 50, 100, 100); |
| | | image crop2 = crop_image(im, -50, -30, 400, 291); |
| | | show_image(im, "original"); |
| | | show_image(small, "smaller"); |
| | | show_image(big, "bigger"); |
| | | show_image(crop, "crop"); |
| | | show_image(crop2, "crop2"); |
| | | cvWaitKey(0); |
| | | } |
| | | |
| | | image load_image_color(char *filename, int h, int w) |
| | | { |
| | | IplImage* src = 0; |
| | |
| | | printf("Cannot load file image %s\n", filename); |
| | | exit(0); |
| | | } |
| | | if(h && w && (src->height != h || src->width != w)){ |
| | | //printf("Resized!\n"); |
| | | IplImage *resized = resizeImage(src, h, w, 0); |
| | | cvReleaseImage(&src); |
| | | src = resized; |
| | | } |
| | | image out = ipl_to_image(src); |
| | | if((h && w) && (h != out.h || w != out.w)){ |
| | | image resized = resize_image(out, h, w); |
| | | free_image(out); |
| | | out = resized; |
| | | } |
| | | cvReleaseImage(&src); |
| | | return out; |
| | | } |
| | |
| | | printf("Cannot load file image %s\n", filename); |
| | | exit(0); |
| | | } |
| | | if(h && w ){ |
| | | IplImage *resized = resizeImage(src, h, w, 0); |
| | | cvReleaseImage(&src); |
| | | src = resized; |
| | | } |
| | | image out = ipl_to_image(src); |
| | | if((h && w) && (h != out.h || w != out.w)){ |
| | | image resized = resize_image(out, h, w); |
| | | free_image(out); |
| | | out = resized; |
| | | } |
| | | cvReleaseImage(&src); |
| | | return out; |
| | | } |