Resizing an Image in MATLAB

后端 未结 1 376
夕颜
夕颜 2021-01-21 17:46

I\'m trying to create a function the scales an image based on a value (scale_zoom) for a homework assignment. I don\'t want to use the MATLAB built in function resize()

相关标签:
1条回答
  • 2021-01-21 18:20

    I had previously answered a question about scaling images using nearest-neighbor interpolation, and much of the code and explanations I used there apply here. The main difference is the final interpolation step. Here's how you can write your function, using INTERP2 and generalizing for a 2-D grayscale or 3-D RGB image of any type:

    function pic_new = scale_image(pic,scale_zoom)
    
      oldSize = size(pic);                               %# Old image size
      newSize = max(floor(scale_zoom.*oldSize(1:2)),1);  %# New image size
      newX = ((1:newSize(2))-0.5)./scale_zoom+0.5;  %# New image pixel X coordinates
      newY = ((1:newSize(1))-0.5)./scale_zoom+0.5;  %# New image pixel Y coordinates
      oldClass = class(pic);  %# Original image type
      pic = double(pic);      %# Convert image to double precision for interpolation
    
      if numel(oldSize) == 2  %# Interpolate grayscale image
    
        pic_new = interp2(pic,newX,newY(:),'cubic');
    
      else                    %# Interpolate RGB image
    
        pic_new = zeros([newSize 3]);  %# Initialize new image
        pic_new(:,:,1) = interp2(pic(:,:,1),newX,newY(:),'cubic');  %# Red plane
        pic_new(:,:,2) = interp2(pic(:,:,2),newX,newY(:),'cubic');  %# Green plane
        pic_new(:,:,3) = interp2(pic(:,:,3),newX,newY(:),'cubic');  %# Blue plane
    
      end
    
      pic_new = cast(pic_new,oldClass);  %# Convert back to original image type
    
    end
    

    And you can test it as follows:

    img = imread('peppers.png');      %# Load the sample peppers image
    newImage = scale_image(img,0.3);  %# Scale it to 30%
    
    0 讨论(0)
提交回复
热议问题