% 双线性插值
% DSC完成功能:
% 1. DSC高度/宽度变化 (默认值:宽800_高600)
% 2. 线数/点数变化 (默认值:线800_点600)
% 3. 扇形张角变化 (默认值:90°)
% 4. 扇形角度偏移 (默认值:无偏移0)
% 5. 扇形水平/垂直平移 (默认值:原点(400,1))
% 6. 原始线数据变化 (默认值:起始线1_终止线800)
% 7. 原始点数据变化 (默认值:起始点1_终止点600)
% 8. 起始半径变化 (默认值:0)
% 9. 放大 (默认值:1)
function J = DSC_Con_B( I,...
m_uDSCMaxWidth,... % DSC显示宽度 (默认值:800)
m_uDSCMaxHeight,... % DSC显示高度 (默认值:600)
m_uStartLine,... % 起始线 (默认值:1)
m_uEndLine,... % 终止线 (默认值:800)
m_uStartPoint,... % 起始点 (默认值:1)
m_uEndPoint,... % 终止点 (默认值:600)
m_fDSCAngle,... % 扇形张角 (默认值:90°)
m_fAngOffset,... % 角度偏移 (默认值:0) (正右负左)
m_iVOffset,... % 垂直偏移 (默认值:0) (正上负下)
m_iHOffset,... % 水平偏移 (默认值:0) (正左负右)
m_uStartRadius,... % 起始半径 (默认值:0)
m_fScale ) % 放大系数 (默认值:1)
m_uLine = m_uEndLine - m_uStartLine + 1; % 线数 (默认值:800)
m_uPoint = m_uEndPoint - m_uStartPoint + 1; % 点数 (默认值:600)
m_halfAng = m_fDSCAngle / 2; % 扇形半张角 (默认值:45°)
m_fLineAng = m_fDSCAngle / (m_uLine - 1); % 线间角 (默认值:0.11264)
m_fLineDis = (m_uDSCMaxHeight - 1 - m_uStartRadius * ( 1 - cos(m_halfAng/180 * pi) ) )/ (m_uPoint - 1) * m_fScale; % 线间距 (默认值:1)
I = I( m_uStartPoint : m_uEndPoint, m_uStartLine : m_uEndLine );
J = zeros(m_uDSCMaxHeight, m_uDSCMaxWidth);
for y = 2 : m_uDSCMaxHeight
for x = 1 : m_uDSCMaxWidth
% Step.1 (x,y) -> (u,v)
u = x - m_uDSCMaxWidth/2 + m_iHOffset;
v = y - 1 + m_iVOffset + round( m_uStartRadius * cos(m_halfAng/180 * pi) );
% Step.2 (u,v) -> (r,theta_)
r = sqrt(u^2 + v^2);
theta_ = atan2(u,v) / pi * 180;
% Step.3 (r,theta_) -> (r, theta)
theta = theta_ + m_halfAng - m_fAngOffset;
% Step.4 Filter the points outside
if theta < 0 || theta >= m_fDSCAngle || r >= (floor( m_uStartRadius * cos(m_halfAng/180 * pi) ) + m_uDSCMaxHeight ) * m_fScale - 1 || r <= m_uStartRadius
continue;
end
% Step.5 Calculate integers and decimals
thetaInt = floor( theta / m_fLineAng ) + 1;
thetaErr = theta - (thetaInt - 1) * m_fLineAng;
rInt = floor( (r - m_uStartRadius) / m_fLineDis ) + 1;
rErr = (r - m_uStartRadius) - (rInt - 1) * m_fLineDis;
% Step.6 Bilinear interpolation
a = I(rInt, thetaInt);
b = I(rInt, thetaInt + 1);
c = I(rInt + 1, thetaInt);
d = I(rInt + 1, thetaInt + 1);
tmp1 = (1 - rErr/m_fLineDis) * double(a) + (rErr/m_fLineDis) * double(c);
tmp2 = (1 - rErr/m_fLineDis) * double(b) + (rErr/m_fLineDis) * double(d);
tmp = (1 - thetaErr/m_fLineAng) * tmp1 + (thetaErr/m_fLineAng) * tmp2;
J(y,x) = tmp;
end
end
J = uint8(J);
end