matlab画像スケーリングアルゴリズムの簡単な原理
http://www.cnblogs.com/xy-kidult/p/3404035.html
主に2つのコードがあります.1つはメインコードで、コメントが含まれています.もう1つはcubic_です.factor関数は、距離係数を計算するために使用されます.
cubic_factor関数
上のコードには「右端と最下辺の画素が実際に計算に関与していない」という問題があり、最初の中心点選択方法によるもののようで、ネット上で誰かが解決策を提案した(http://handspeaker.iteye.com/blog/1545126)を見て、たぶん彼の考えを理解して、実験の後、効果がなくて、私は間違っているかもしれませんが、今度この問題を解決してコードを修正しましょう.
主に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)を見て、たぶん彼の考えを理解して、実験の後、効果がなくて、私は間違っているかもしれませんが、今度この問題を解決してコードを修正しましょう.