• 图像转换 之 方形图转化扇形图


    核心算法,是用 的那个 cordic 算法..

    http://www.cnblogs.com/signal/archive/2012/11/13/2768140.html

    这里主要是想把算法弄到FPGA中去写的测试代码...

    这里主要是贴关键代码: 

    void CTestImgDlg::OnImageCordic()
    {
    // TODO: Add your control notification handler code here
    DWORD dwStart = GetTickCount();

    int i;
    int j;

    for (i=0; i<m_HeightSW; i++)
    {
    for (j=0; j<m_WidthSW; j++)
    {
    // j = m_WidthSW/2;
    int posX = i;
    int posY = j;

    BYTE val = this->GetImageCordic(posX,posY);    --开始转换 
    m_pDataSW[i*m_WidthSW + j] = val;

    }
    }

    CString str;
    str.Format(" %d ", GetTickCount() - dwStart);
    this->SetWindowText(str);

    this->Invalidate();
    }

    #define MOV_POS_X (-256)     //坐标变幻值
    #define MOV_POS_Y (86)


    #define US_IMG_W (81)          // 原始图像的大小
    #define US_IMG_H (256)


    #define ANG_UNIT (60.0/(US_IMG_W - 1)) // 图像横像素所占角度
    #define LEN_UNIT ((512 - 1 - 20)/(US_IMG_H*1.0)) // 图像坚像素所占长度


    BYTE CTestImgDlg::GetImageCordic(int i, int j)
    {
    BYTE val = m_pDataSW[i*m_WidthSW + j];

    // 直角坐标位置改变
    double posX = i + MOV_POS_Y;
    double posY = j + MOV_POS_X;

    // posX = 300;
    // posY = 300;
    // 转为极坐标

    double len;
    double ang;
    // cordic_int(i,j,len,ang);
    cordic_double(posX,posY,len,ang);


    // 换算为直角坐标的坐标
    // double posX;
    // double posY;

    posX = ang/ANG_UNIT;
    posY = len/LEN_UNIT;


    posX = posX + US_IMG_W/2;
    posY = posY - 56;

    //最近邻的必要.........
    // posX += 0.5;
    // posY += 0.5;


    // 没有落在图像上,则为黑色
    if (posX < 0.0 || posX > US_IMG_W )
    {
    return 0;
    }
    if (posY < 0.0 || posY > US_IMG_H )
    {
    return 0;
    }

    // 下面是像素的计算--用的是简化计算, 把一个像素的落点分为8*8的可能区域,

    //  如果要求更高,可以区分更细,而且不占什么时间,  不过我想没必要


    int pointX = posX;
    int pointY = posY;

    //落点所在的区域
    int X_c0 = (posX - pointX)*8;
    int X_c1 = (posY - pointY)*8;

    //取出四个点
    int val00 = m_pDataUS[pointY * m_WidthUS + pointX];
    int val01 = m_pDataUS[pointY * m_WidthUS + pointX + 1];
    int val10 = m_pDataUS[(pointY+1) * m_WidthUS + pointX];
    int val11 = m_pDataUS[(pointY+1) * m_WidthUS + pointX + 1];


    //计算值--先求横向,再求纵向
    int v1 = val00 + ((val01 - val00)>>3)*X_c0;
    int v2 = val10 + ((val11 - val10)>>3)*X_c0;
    val = v1 + ((v2 - v1)>>3)*X_c1;

    // val = posY;
    // 计算图像数值


    return val;
    }

  • 相关阅读:
    唐李问对 简单飞扬
    【关键字】Javascript js 身份证号码 检测 规则 18位 15位 简单飞扬
    司马法 简单飞扬
    实现身份证的15位转18位 简单飞扬
    JAVA验证身份证号码 简单飞扬
    页面验证的类型 简单飞扬
    模拟MSN和QQ的上线提示效果 区别IE和FF浏览器 简单飞扬
    孙子兵法 简单飞扬
    吴子 简单飞扬
    C# WPF MVVM 实战 2.1
  • 原文地址:https://www.cnblogs.com/signal/p/4019251.html
Copyright © 2020-2023  润新知