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


    核心算法,是用 的那个 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;
    }

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/signal/p/4019251.html
Copyright © 2020-2023  润新知