zoukankan      html  css  js  c++  java
  • 缩放图像的双线性内插法

    今天将图像缩放的双线性内插法弄完了,主要的思想如下:

    对于一个目的像素,通过目标图像与源图像的比值进行反向变换得到一个浮点坐标,如fx(x+u,y+v)其中为非负整数,u,v为区间[0,1]上的浮点数。则目的像素的颜色值可以由源图像的点fx(x,y)与其相邻的四个点的颜色值决定。

    公式为:fx(x+u,y+v)=(1-u)(1-v)fx(x,y)+(1-u)(v)fx(x,y+1) +(u)(1-v)fx(x+1,y)+uvfx(x+1,y+1);

    下面是我自己写的一个缩放图像的函数。

    void CTestView::Linear_BMP(COLORREF **DesImage,double DesWidth,double DesHeight,COLORREF **SrcImage ,double SrcWidth,double SrcHeight)
    {
    if(SrcImage == NULL)
    return;
    DesImage=new COLORREF*[(int)DesHeight];
    for(int n1=0;n1<DesHeight;n1++)
    DesImage[n1]=new COLORREF[(int)DesWidth];
    double w = (double)SrcWidth/(double)DesWidth;//源/目标=比例
    double h = (double)SrcHeight/(double)DesHeight;
    double u,v;
    double Sx,Sy;
    double pm[4];
    int tx,ty;
    int red[4],green[4],blue[4];
    double r=0,g=0,b=0;
    for(int i = 0; i < DesHeight; i++)
    {
    Sy = (double)(i) * h;
    ty = (int)Sy;

    v = fabs(Sy - ty);
    for(int j = 0; j<DesWidth; j++)
    {

    Sx = (double)(j) * w ;
    tx = (int)Sx;

    u = fabs(Sx - tx);
    pm[0] = ( 1.0 - u ) * ( 1.0 - v );
    pm[1] = v * ( 1.0 - u );
    pm[2] = u * ( 1.0 - v );
    pm[3] = u * v;
    if(tx>=SrcWidth - 2)
    tx = SrcWidth - 2;
    if(ty>=SrcHeight - 2)
    ty = SrcHeight - 2;
    red[0] = GetRValue(SrcImage[ty][tx]);
    red[1] = GetRValue(SrcImage[ty+1][tx]);
    red[2] = GetRValue(SrcImage[ty][tx+1]);
    red[3] = GetRValue(SrcImage[ty+1][tx+1]);

    green[0] = GetGValue(SrcImage[ty][tx]);
    green[1] = GetGValue(SrcImage[ty+1][tx]);
    green[2] = GetGValue(SrcImage[ty][tx+1]);
    green[3] = GetGValue(SrcImage[ty+1][tx+1]);

    blue[0] = GetBValue(SrcImage[ty][tx]);
    blue[1] = GetBValue(SrcImage[ty+1][tx]);
    blue[2] = GetBValue(SrcImage[ty][tx+1]);
    blue[3] = GetBValue(SrcImage[ty+1][tx+1]);
    r = 0;
    g = 0;
    b = 0;
    for(int m = 0;m<4;m++)
    {
    r += pm[m] * red[m];
    g += pm[m] * green[m];
    b += pm[m] * blue[m];
    }
    // DesImage[i][j] = pm[0] * SrcImage[ty][tx] + pm[1] * SrcImage[ty][tx+1] + pm[2] * SrcImage[ty+1][tx] + pm[3] * SrcImage[ty+1][tx+1];
    // DesImage[i][j] = SrcImage[ty][tx];
    DesImage[i][j] = RGB(r,g,b);
    // DesImage[i][j] = (SrcImage[ty][tx]+SrcImage[ty][tx+1]+ SrcImage[ty+1][tx]+SrcImage[ty+1][tx+1])/4;
    }
    }

    LImage = DesImage;
    }




  • 相关阅读:
    leetcode每日刷题计划-简单篇day28
    leetcode每日刷题计划-简单篇day27
    leetcode每日刷题计划-简单篇day26
    leetcode每日刷题计划-简单篇day25
    java多线程--大作业相关
    leetcode每日刷题计划-简单篇day24
    leetcode每日刷题计划-简单篇day23
    SpringBoot集成JWT实现token验证
    RabbitMQ 延迟队列,消息延迟推送的实现
    Redis精进:List的使用和应用场景
  • 原文地址:https://www.cnblogs.com/gaoteng/p/2350375.html
Copyright © 2011-2022 走看看