matlab画像スケーリングアルゴリズムの簡単な原理


http://www.cnblogs.com/xy-kidult/p/3404035.html
主に2つのコードがあります.1つはメインコードで、コメントが含まれています.もう1つはcubic_です.factor関数は、距離係数を計算するために使用されます.
clear;
close all;  
clc;


CONST=50;
A=imread('testImage\hyf1.bmp');
bwimg=im2bw(A);
resize_img=[];
[srcWidth srcHeight]=size(bwimg);


% %
%         http://blog.csdn.net/ArtX/article/details/1540539 http://blog.csdn.net/qiqi5521/article/details/2207562     ,    。
% %    
% %       srcWidth/dstWidth = srcX/dstY,    srcX  
% %% 
% dstWidth=srcWidth+CONST*2;
% dstHeight=srcHeight+CONST*2;
% resize_img=zeros(dstWidth,dstHeight);
% 
% %           
% for i=1:dstWidth
%     for j=1:dstHeight
%     src_i=i*(srcWidth/dstWidth);
%     src_j=j*(srcHeight/dstHeight);
%     resize_img(i,j)=bwimg(round(src_i),round(src_j)); % round    
%     end
% end
% 
% figure,imshow(bwimg);
% figure,imshow(resize_img)

% %         
% %      
% %         srcWidth/dstWidth = srcX/dstY,       srcX    ,         ,
% %             ,                 ,      ,        dstX,
% %          
% %% % f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-v)f(i+1,j)+uvf(i+1,j+1)
% % i,j           ; u,v          
% %% %   :     ,               ,       ,             
% 
% dstWidth=srcWidth+CONST*2;
% dstHeight=srcHeight+CONST*2;
% resize_img=zeros(dstWidth,dstHeight);
% 
% %           
% for i=1:dstWidth-1
%     for j=1:dstHeight-1
%     src_i=i*(srcWidth/dstWidth);
%     src_j=j*(srcHeight/dstHeight);
%     src_ii=fix(src_i);
%     src_iu=src_i - src_ii; % none fix part
%     src_jj=fix(src_j);
%     src_jv=src_j - src_jj;
%     if src_ii == 0 
%         src_ii=src_ii+1;
%     end
%     if src_jj ==0 
%         src_jj=src_jj+1;
%     end
%     resize_img(i,j)=(1-src_iu)*(1-src_jv)*bwimg(src_ii,src_jj)+(1-src_iu)*src_jv*bwimg(src_ii,src_jj+1)+src_iu*(1-src_jv)*bwimg(src_ii+1,src_jj)...
%         +src_iu*src_jv*bwimg(src_ii+1,src_jj+1);
%     end
% end
% figure,imshow(bwimg);
% figure,imshow(resize_img)


%      
%           ,     ,           (i+u,j+v)   16   ,            f(i+u,j+v):
% 
%     f(i+u,j+v) = [A] * [B] * [C]
% 
% [A]=[ S(u + 1) S(u + 0) S(u - 1) S(u - 2) ]
% 
%   ┏ f(i-1, j-1) f(i-1, j+0) f(i-1, j+1) f(i-1, j+2) ┓
% [B]=┃ f(i+0, j-1) f(i+0, j+0) f(i+0, j+1) f(i+0, j+2) ┃
%   ┃ f(i+1, j-1) f(i+1, j+0) f(i+1, j+1) f(i+1, j+2) ┃
%   ┗ f(i+2, j-1) f(i+2, j+0) f(i+2, j+1) f(i+2, j+2) ┛
% 
%   ┏ S(v + 1) ┓
% [C]=┃ S(v + 0) ┃
%   ┃ S(v - 1) ┃
%   ┗ S(v - 2) ┛
% 
%    ┏ 1-2*Abs(x)^2+Abs(x)^3      , 0<=Abs(x)<1
% S(x)={ 4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3 , 1<=Abs(x)<2
%    ┗ 0                , Abs(x)>=2
%    ,S(x)   Sin(x*Pi)/x
%    (Pi    ——π),      ,    Sin(x*Pi)/x    0~pi  ,            S(x)
%     A、B、C         ,          ,                                          


dstWidth=srcWidth-CONST*2;
dstHeight=srcHeight-CONST*2;
resize_img=zeros(dstWidth,dstHeight);
A=[];B=[];C=[];


%           
for i=3:dstWidth-2
    for j=3:dstHeight-2
    src_i=i*(srcWidth/dstWidth);
    src_j=j*(srcHeight/dstHeight);
    src_ii=fix(src_i); %     
    src_iu=src_i - src_ii; %     
    src_jj=fix(src_j);
    src_jv=src_j - src_jj;
    
    A=[ cubic_factor(src_iu+1) cubic_factor(src_iu) cubic_factor(src_iu-1) cubic_factor(src_iu-2) ];
    C=[ cubic_factor(src_jv+1); cubic_factor(src_jv); cubic_factor(src_jv-1); cubic_factor(src_jv-2) ];
    B=[ bwimg(src_ii -1,src_jj -1) bwimg(src_ii-1,src_jj) bwimg(src_ii-1,src_jj+1) bwimg(src_ii-1,src_jj+2);...
        bwimg(src_ii,src_jj-1) bwimg(src_ii,src_jj) bwimg(src_ii,src_jj+1) bwimg(src_ii,src_jj+2); ...
        bwimg(src_ii+1,src_jj-1) bwimg(src_ii+1,src_jj) bwimg(src_ii+1,src_jj+1) bwimg(src_ii+1,src_jj+2); ...
        bwimg(src_ii+2,src_jj-1) bwimg(src_ii+2,src_jj) bwimg(src_ii+2,src_jj+1) bwimg(src_ii+2,src_jj+2) ];
    
    resize_img(i,j)=A*B*C;
    
 
    end
end

figure,imshow(bwimg);
figure,imshow(resize_img)


% dstimg=imresize(srcimg,4,'bicubic'); % matlab   ,  imresize             


 
cubic_factor関数
%         
%    ┏ 1-2*Abs(x)^2+Abs(x)^3      , 0<=Abs(x)<1
% S(x)={ 4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3 , 1<=Abs(x)<2
%    ┗ 0                , Abs(x)>=2
function S=cubic_factor(x)

if 0<=abs(x)<1
    S=1-2.*abs(x).^2+abs(x).^3;
elseif 1<=abs(x)<2
    S=4-8.*abs(x)+5.*abs(x).^2-abs(x).^3;
else
    S=0;
end


 
 
上のコードには「右端と最下辺の画素が実際に計算に関与していない」という問題があり、最初の中心点選択方法によるもののようで、ネット上で誰かが解決策を提案した(http://handspeaker.iteye.com/blog/1545126)を見て、たぶん彼の考えを理解して、実験の後、効果がなくて、私は間違っているかもしれませんが、今度この問題を解決してコードを修正しましょう.