2011-05-31 4 views
2

J'essaie de créer une fonction qui met à l'échelle une image basée sur une valeur (scale_zoom) pour une tâche de devoirs. Je ne veux pas utiliser la fonction intégrée MATLAB resize() dans cette fonction, donc j'essaie d'interpoler. Toute aide serait grandement appréciée. Voilà ce que j'ai jusqu'à présent:Redimensionnement d'une image dans MATLAB

function pic_new=scale_image(pic,scale_zoom) 
    [row, col]=size(pic) 
    ht_scale=size(pic,1)/scale_zoom*col 
    wid_scale=size(pic,2)/scale_zoom*row 

    size(ht_scale) 
    size(wid_scale) 
    x=(0:scale_zoom)*wid_scale 
    y=(0:scale_zoom)*ht_scale 
    length(x) 
    length(y) 
    %plotvals=0:0.1:scale_zoom (this is not necessary i think) 
    newimg=interp1(pic,x,y,'cubic') 
    image(newimg) 
end 

Je pense que je suis interpoler très mal:/

+2

Pourquoi utilisez-vous pas interp2() – DanielHsH

+1

Je suppose que vous signifie que vous ne voulez pas utiliser 'imresize', même si vous avez écrit' resize'. Parce que j'utiliserais 'imresize' pour ça. –

Répondre

6

j'avais previously answered une question sur scaling images using nearest-neighbor interpolation, et une grande partie du code et des explications j'Appliquons là ici . La principale différence est l'étape finale d'interpolation. Voici comment vous pouvez écrire votre fonction, en utilisant INTERP2 et généralisante pour un 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 

Et vous pouvez le tester comme suit:

img = imread('peppers.png');  %# Load the sample peppers image 
newImage = scale_image(img,0.3); %# Scale it to 30%