• 全部
...

图像处理中的双三次插值

thuvincenthan 2014-11-12 09:54:16
LZ最近在写一个图像处理的C#小程序,要求用双三次插值方法实现图像的旋转扭曲、球面镜变换等效果。
插值的数学原理没有问题,但是用双三次插值处理后会出现很多毛刺,即不同颜色的边缘处会出现颜色偏差很大的像素。用最邻近插值和双线性插值就不会出现这种情况。
目前没想清楚原因,求大神解答!

毛刺现象如图:


经过双三次插值的旋转扭曲处理之后就会这样
...全文
给本帖投票
5505 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40144266 2018-12-16
  • 打赏
  • 举报
回复
请问u,v的具体数学公式是什么呢?没太看明白,谢谢!
thuvincenthan 2014-11-16
  • 打赏
  • 举报
回复
确实是这样,以前没怎么做过图像处理没有注意到这个…… 感谢~给分!
dianyancao 2014-11-16
  • 打赏
  • 举报
回复
测试了Cubic插值,估计是你数据显示时没有饱和到[0,255]引起的
如下代码测试通过:
template<class T1,class T2>
inline void CubicInterpolation(MImageArray<T1>* sourceImage,MImageArray<T2>* targetImage,int targetIndex,float dblXX,float dblYY)
{
int intXX,intYY;
intXX=floor(dblXX);
intYY=floor(dblYY);

float u,v;
u=dblXX-intXX;
v=dblYY-intYY;

float u0,u1,u2,u3;
float v0,v1,v2,v3;

u0=1+u;
u1=u;
u2=1-u;
u3=2-u;

v0=1+v;
v1=v;
v2=1-v;
v3=2-v;

u0=4-8*u0+5*u0*u0-u0*u0*u0;
u1=1-2*u1*u1+u1*u1*u1;
u2=1-2*u2*u2+u2*u2*u2;
u3=4-8*u3+5*u3*u3-u3*u3*u3;

v0=4-8*v0+5*v0*v0-v0*v0*v0;
v1=1-2*v1*v1+v1*v1*v1;
v2=1-2*v2*v2+v2*v2*v2;
v3=4-8*v3+5*v3*v3-v3*v3*v3;

float f00,f01,f02,f03;
float f10,f11,f12,f13;
float f20,f21,f22,f23;
float f30,f31,f32,f33;

f00=sourceImage->at(intXX-1,intYY-1);
f01=sourceImage->at(intXX,intYY-1);
f02=sourceImage->at(intXX+1,intYY-1);
f03=sourceImage->at(intXX+2,intYY-1);

f10=sourceImage->at(intXX-1,intYY);
f11=sourceImage->at(intXX,intYY);
f12=sourceImage->at(intXX+1,intYY);
f13=sourceImage->at(intXX+2,intYY);

f20=sourceImage->at(intXX-1,intYY+1);
f21=sourceImage->at(intXX,intYY+1);
f22=sourceImage->at(intXX+1,intYY+1);
f23=sourceImage->at(intXX+2,intYY+1);

f30=sourceImage->at(intXX-1,intYY+2);
f31=sourceImage->at(intXX,intYY+2);
f32=sourceImage->at(intXX+1,intYY+2);
f33=sourceImage->at(intXX+2,intYY+2);

float g0,g1,g2,g3;
g0=v0*f00+v1*f10+v2*f20+v3*f30;
g1=v0*f01+v1*f11+v2*f21+v3*f31;
g2=v0*f02+v1*f12+v2*f22+v3*f32;
g3=v0*f03+v1*f13+v2*f23+v3*f33;

float s;
s=g0*u0+g1*u1+g2*u2+g3*u3;

if (s<0) s=0;
if (s>255) s=255;

targetImage->at(targetIndex)=s;
}

原图像:

放大3.11倍后的图像:
thuvincenthan 2014-11-15
  • 打赏
  • 举报
回复
引用 4 楼 u011943624 的回复:
[quote=引用 3 楼 dianyancao 的回复:] [quote=引用 2 楼 u011943624 的回复:] 嗯我就是这样写的,结果就会出现图中的毛刺
给我权值,测试看看,你的权值加起来是1吗? 连续的滤波权值应该不会产生不连续的像素值啊[/quote] 加权方法如图所示 插值核应该没问题,我也纳闷为什么会出现不连续像素值……[/quote] 非常感谢!我再自己试试吧~
dianyancao 2014-11-14
  • 打赏
  • 举报
回复
经测试,插值的权值没有问题,既然插值的数学原理没有问题,你看看这个式子对(u,v)的取值有哪些限制吧^_^
thuvincenthan 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 dianyancao 的回复:
最近邻插值的实现了,Cubic的就是邻域内的像素值用权值线性叠加啊 三个通道分别混合后得到目标像素值就行
嗯我就是这样写的,结果就会出现图中的毛刺
thuvincenthan 2014-11-13
  • 打赏
  • 举报
回复
引用 3 楼 dianyancao 的回复:
[quote=引用 2 楼 u011943624 的回复:]
嗯我就是这样写的,结果就会出现图中的毛刺

给我权值,测试看看,你的权值加起来是1吗?
连续的滤波权值应该不会产生不连续的像素值啊[/quote]
加权方法如图所示

插值核应该没问题,我也纳闷为什么会出现不连续像素值……
dianyancao 2014-11-13
  • 打赏
  • 举报
回复
引用 2 楼 u011943624 的回复:
嗯我就是这样写的,结果就会出现图中的毛刺
给我权值,测试看看,你的权值加起来是1吗? 连续的滤波权值应该不会产生不连续的像素值啊
dianyancao 2014-11-13
  • 打赏
  • 举报
回复
最近邻插值的实现了,Cubic的就是邻域内的像素值用权值线性叠加啊 三个通道分别混合后得到目标像素值就行

4,496

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部