双三次插值平滑算法??

e_feeling 2002-11-18 03:25:54
谁知道双三次插值平滑算法?请赐教!
...全文
1408 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_feeling 2002-12-04
  • 打赏
  • 举报
回复
《图像处理(下)计算机视觉》
这本书那里有?转化为矢量处理比较慢.我想直接处理.
XCOOL 2002-11-25
  • 打赏
  • 举报
回复
用抖动的方法和半像术法都可以消除锯齿,要不你可以先把点阵字体转化成为矢量字这个问题就很好解决了,可以用的方法在《图像处理(下)计算机视觉》中有提到过
e_feeling 2002-11-23
  • 打赏
  • 举报
回复
点阵字体放大出现锯齿,用什么插值方法可较好的消除锯齿????
yuga 2002-11-21
  • 打赏
  • 举报
回复
考虑一个浮点坐标(i+u,j+v)周围16个临点

PIXELCOLORRGB CImageGeometry::Interpolate(LPBYTE lpbySrcXY, int x, int y, float fu, float fv, int nScanWidth, int nScanHeight)
{
PIXELCOLORRGB rgb;

//行字节数, 可以将dwWidthBytes作为参数传递过来
DWORD dwWidthBytes = (DWORD)nScanWidth * 4;

switch(m_dwQuality)
{
case IMAGE_GEOMETRY_NEAREST_NEIGHBOR_INTERPOLATE :
{
BYTE* pbySrc = lpbySrcXY;
rgb.blue = *pbySrc++;
rgb.green = *pbySrc++;
rgb.red = *pbySrc++;
break;
}
case IMAGE_GEOMETRY_BILINEAR_INTERPOLATE :
{
//相邻的四个像素最右下角点的x, y坐标偏移量
int nx = 1;
int ny = 1;
if((x + 1) > (nScanWidth - 1)) nx = 0;
if((y + 1) > (nScanHeight - 1)) ny = 0;

//相邻四个像素的像素值
BYTE abyRed[2][2], abyGreen[2][2], abyBlue[2][2];

//像素点(x, y)的数据位置
BYTE* pbySrc = lpbySrcXY;
//获取像素数值.
//(x, y) = (x, y) + (0, 0)
abyBlue[0][0] = *pbySrc++;
abyGreen[0][0] = *pbySrc++;
abyRed[0][0] = *pbySrc++;

//(x + 1, y) = (x, y) + (1, 0)
pbySrc = (lpbySrcXY + nx * 4);
abyBlue[1][0] = *pbySrc++;
abyGreen[1][0] = *pbySrc++;
abyRed[1][0] = *pbySrc++;


//指向下一行数据
BYTE* pbySrcTemp = (lpbySrcXY + ny * dwWidthBytes);

//(x , y + 1) = (x, y) + (0, 1)
pbySrc = pbySrcTemp;
abyBlue[0][1] = *pbySrc++;
abyGreen[0][1] = *pbySrc++;
abyRed[0][1] = *pbySrc++;

//(x + 1, y + 1) = (x, y) + (1, 1)
pbySrc = pbySrcTemp + (4 * nx);
abyBlue[1][1] = *pbySrc++;
abyGreen[1][1] = *pbySrc++;
abyRed[1][1] = *pbySrc++;

rgb.red = (BYTE)(BOUND(((1 - fu) * (1 - fv) * ((float)abyRed[0][0]) +
(1 - fu) * fv * ((float)abyRed[0][1]) +
fu * (1 - fv) * ((float)abyRed[1][0]) +
fu * fv * ((float)abyRed[1][1])), 0, 255));
rgb.green = (BYTE)(BOUND(((1 - fu) * (1 - fv) * ((float)abyGreen[0][0]) +
(1 - fu) * fv * ((float)abyGreen[0][1]) +
fu * (1 - fv) * ((float)abyGreen[1][0]) +
fu * fv * ((float)abyGreen[1][1])), 0, 255));

rgb.blue = (BYTE)(BOUND(((1 - fu) * (1 - fv) * ((float)abyBlue[0][0]) +
(1 - fu) * fv * ((float)abyBlue[0][1]) +
fu * (1 - fv) * ((float)abyBlue[1][0]) +
fu * fv * ((float)abyBlue[1][1])), 0, 255));
break;
}

case IMAGE_GEOMETRY_THREE_ORDER_INTERPOLATE :
{
//像素坐标
int xx[4], yy[4];
//相邻四个像素的像素值
BYTE abyRed[4][4], abyGreen[4][4], abyBlue[4][4];

xx[0] = -1; xx[1] = 0; xx[2] = 1; xx[3] = 2;
yy[0] = -1; yy[1] = 0; yy[2] = 1; yy[3] = 2;

//保证合法
if((x - 1) < 0) xx[0] = 0;
if((x + 1) > (nScanWidth - 1)) xx[2] = 0;
if((x + 2) > (nScanWidth - 1)) xx[3] = ((xx[2] == 0) ? 0 : 1);

if((y - 1) < 0) yy[0] = 0;
if((y + 1) > (nScanHeight - 1)) yy[2] = 0;
if((y + 2) > (nScanHeight - 1)) yy[3] = ((yy[2] == 0) ? 0 : 1);

//像素点(x, y)的数据位置
//获取数据
int i;
for(i = 0;i < 4;i++)
{
//像素点(x, y)的数据位置
BYTE* pbySrcBase = lpbySrcXY + yy[i] * dwWidthBytes;

for(int j = 0;j < 4;j++)
{
BYTE* pbySrc = pbySrcBase + 4 * xx[j];
abyBlue[i][j] = *pbySrc++;
abyGreen[i][j] = *pbySrc++;
abyRed[i][j] = *pbySrc++;
}
}

//u, v向量
float afu[4], afv[4];

afu[0] = Sinxx(1.0f + fu);
afu[1] = Sinxx(fu);
afu[2] = Sinxx(1.0f - fu);
afu[3] = Sinxx(2.0f - fu);

afv[0] = Sinxx(1.0f + fv);
afv[1] = Sinxx(fv);
afv[2] = Sinxx(1.0f - fv);
afv[3] = Sinxx(2.0f - fv);

//矩阵乘向量的中间值
float afRed[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float afGreen[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float afBlue[4] = {0.0f, 0.0f, 0.0f, 0.0f};

for(i = 0;i < 4;i++)
{
for(int j = 0;j < 4;j++)
{
afRed[i] += afv[j] * abyRed[j][i];
afGreen[i] += afv[j] * abyGreen[j][i];
afBlue[i] += afv[j] * abyBlue[j][i];
}
}
rgb.red = (BYTE)(BOUND((afu[0] * afRed[0] + afu[1] * afRed[1] + afu[2] * afRed[2] +
afu[3] * afRed[3]), 0, 255));
rgb.green = (BYTE)(BOUND((afu[0] * afGreen[0] + afu[1] * afGreen[1] + afu[2] * afGreen[2] +
afu[3] * afGreen[3]), 0, 255));
rgb.blue = (BYTE)(BOUND((afu[0] * afBlue[0] + afu[1] * afBlue[1] + afu[2] * afBlue[2] +
afu[3] * afBlue[3]), 0, 255));
break;
}
default : break;
}//end switch

return rgb;
}
e_feeling 2002-11-21
  • 打赏
  • 举报
回复
yuga (棒榜)
你说说看? ?
yuga 2002-11-21
  • 打赏
  • 举报
回复
本来要告诉你的
既然你知道了我就不罗嗦了
分给我吧,呵呵
e_feeling 2002-11-21
  • 打赏
  • 举报
回复
我自己可能清楚了.

4,446

社区成员

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

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