(一)基础知识

极坐标变换及其反变换的关键在于,根据极坐标变换前的图像(我们称为“圆图”)确定极坐标变换后的图像(我们称为“方图”)上每个像素点的像素值。也即是找到“圆图”和“方图”间几何坐标的对应关系。

1、极坐标变换

原理:
如下图所示,实现极坐标变换的关键即在于找到圆图上任一点P(i,j),在方图上对应的点p(m,n),然后通过插值算法实现圆图上所有像素点的赋值。
方图上,其行列数分别为M、N,方图上的每一列对应为圆图上的每条半径,半径方向存在着一个长度缩放因子delta_r = M/R,圆周方向被分为N等分,即角度因子为delta_t = 2π/N;
圆图上,图像坐标(i,j)和世界坐标(x,y)有着如下变换关系:x = j - R, y = R - i;
那么,图中P点半径长度为r = sqrt(xx + yy),角度theta = arctan(y/x);
圆图上点P在方图上对应行数为r/delta_r;
圆图上点P在方图上对应的列数n = thata/delta_t。

图像变换过程可以参考

  1. 图像的极坐标变换
  2. 图像极坐标变换
  3. 虹膜图像处理程序

(二)软件设计

因为这个代码时应用于嵌入式平台必须考虑到计算速度的问题,所以这里我们自己实现三角函数的近似计算缺点在于,边界点可能会出现失真。

/*** @fn  float fastSin(float x)** @brief   自定义快速变换 sin  cos  函数  定义 而外精度 更高拟合效果 参考链接*          https://www.cnblogs.com/sun11086/archive/2009/03/20/1417944.html** @author  IRIS_Chen* @date    2019/6/17** @param   x   The x coordinate** @return  A float*/
//本质上是利用了一个已经拟合好的二次函数近似三角函数
float fastSin(float x)
{float y;// 限定 x 在 -Pi  到 piwhile (x < - PI){x += (float)(2 * PI);}while (x > PI){x -= (float)(2 * PI);}const float B = 1.2732; // 4 / CV_PI;const float C = -0.4053; // -4 / (CV_PI*CV_PI);if(x>0){y = B * x + C * x * x;}else{y = -1*B * x + C * x * x;}return y;
}/*** @fn  float fastCos(float x)** @brief   Fast cosine** @author  IRIS_Chen* @date    2019/6/17** @param   x   The x coordinate** @return  A float*/
float fastCos(float x)
{return fastSin(x + 1.5707);
}
Mat creatMapMat(Mat src, int rows_c,int cols_c,double startdelta)
{Mat dst;int i,j;u8* inaddr;u8* outaddr;int polar_d =src.width;double polar_r = polar_d / 2.0;printf("1");dst=create("..\\picture\\test.bmp",cols_c,rows_c,3);double delta_r = polar_r / rows_c; //半径因子double delta_t = 2.0*PI / cols_c;  //角度因子double center_polar_x = (polar_d - 1) / 2.0;double center_polar_y = (polar_d - 1) / 2.0;printf("2");for (i = 0; i < cols_c; i++){double theta_p = i * delta_t+startdelta; //方图第i列在圆图对应线的角度double sin_theta = fastSin(theta_p);double cos_theta = fastCos(theta_p);for (int j = 0; j < rows_c; j++){double temp_r = j * delta_r; //方图第j行在圆图上对应的半径长度int polar_x = (int)(center_polar_x + temp_r * cos_theta);int polar_y = (int)(center_polar_y - temp_r * sin_theta);if(i<dst.width&&j<dst.highth&&polar_x<src.width&&polar_y<=src.highth){inaddr=at(&dst,i,j);outaddr=at(&src,polar_x,polar_y);*inaddr=*outaddr;*(inaddr+1)=*(outaddr+1);*(inaddr+2)=*(outaddr+2);}}}return dst;
}

(三)应用举例

/*************************************************
Copyright © Yueyang Co. Ltd. 2019-2029. All rights reserved.
File name: cv.h
Author: Yueyang
Version: V1.0
Description: LiteCV运行主函数
Others:
Log: 11.3 Yueyang
*************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>#include "bmp.h"
#include "cv.h"
#include "GeoTrans.h"
#include "PointOr.h"
#include "BasicGui.h"int main()
{Mat src;Mat_Init();src=load("..\\picture\\hole.bmp");Mat dst=dst=creatMapMat(src, 500,500,PI/4);save("..\\picture\\test.bmp",&dst);show(&dst);destory(&src);destory(&dst);return 0;
}

原图:
这是一张医学中使用的人的血管内壁照片:

变换后:

(四)写在后面

因为LiteCV项目才刚刚写了一个开头,代码中有错误的地方还望指出。我已经将项目同步到了github,我会实时更新这个代码仓库。
项目github地址:
LITECV

【数字图像处理】图像几何变换之 图像的极坐标变化展开鱼眼图相关推荐

  1. 数字图像处理笔记-02(图像空域增强技术及联合运用)

    数字图像处理笔记-02(图像空域增强技术及联合运用) (一) 图像增强 1.1 基本概念 由于图像在传输或者处理过程中会引入噪声或使图像变模糊,从而降低了图像质量,甚至淹没了特 征,给分析带来了困难. ...

  2. 本科课程【数字图像处理】实验3 - 图像的几何变换

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  3. 数字图像处理与Python实现-图像几何变换-图像金字塔

    图像金字塔 图像金字塔 1. 前言 高斯图像金字塔 代码实现: 1. 前言 有些情况下,我们需要处理源自同一张图像的不同分辨率的图像集合.这些不同分辨率的图像组成的集合称为图像金字塔.图像金字塔就是用 ...

  4. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 【数字图像处理】实验一图像基本变换(MATLAB实现)

    目录 一.实验意义及目的 二.实验内容 三.Matlab 相关函数介绍 四.参考代码 五.运行结果 六.实验要求 (1)将彩色图像采用不同的灰度化方法实现灰度化: (2)将彩色图像变换到 YCbCr. ...

  6. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换 ...

  7. 以窗口形式进行数字图像处理时,在图像边界处对超出图像边界的窗口内容的映射(对称)处理

    在数字图像处理时,我们经常会以窗口的形式进行相关的运算,如滤波处理,而在图像边界处,窗口可能太大以至于超出边界,这时候我们可以做一个映射(对称)处理,来补齐窗口中超出图像边界的部分.如下图,窗口大小是 ...

  8. 数字图像处理、拼接,图像静态滤镜(GPUImage/GPU加速) - Android

    图像滤镜处理的两种方式:RGB点乘运算:GPU的矩阵运算(效率更高).图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片:矩阵~利用矩阵计算得到新的矩阵修改图片. 几个图像像素 ...

  9. Matlab数字图像处理 实验3、图像边缘检测的计算机实现

    子曰:桃李不言,下自成蹊. 图 像 边 缘 检 测 的 计 算 机 实 现 图像边缘检测的计算机实现 图像边缘检测的计算机实现 P a r t . 0 实 验 目 的 仅 限 于 学 习 交 流 Pa ...

最新文章

  1. antd 表单提交,文件和表单内容一起提交,表单校验
  2. 易点租加速电脑租赁市场布局
  3. matplotlib的下载和安装方法
  4. 北邮校园网自动登录 python
  5. mysql dump gtid_mysqldump导出数据备份 --set-gtid-purged=OFF
  6. 怎么让程序后台运行_CPU中的程序是怎么运行起来的?
  7. Java中的安全加密
  8. GitGithub学习笔记
  9. 竞价推广经验分享 账户的搭建方法
  10. iOS 6 SDK: 在应用内展示App Store
  11. 什么是 Python 编程语言?
  12. Python基础项目:超市购物管理系统
  13. [BZOJ3653]谈笑风生 主席树
  14. kubernetes部署分布式存储longhorn
  15. 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)
  16. html边框显示长短调整,CSS之border边框长度控制
  17. jude(java建模软件)_JUDE(JAVA建模软件)
  18. Springer 参考文献显示?
  19. 业务规则引擎:Code Effects 5.X Crack-New
  20. Java安全攻防之从wsProxy到AbstractTranslet

热门文章

  1. 阿里巴巴年报来了,一天收入6.85亿
  2. 高德地图插件的简单使用
  3. Uniapp微信小程序视频全屏播放功能极简实现法
  4. Google 工程主管:AIGC 将在三年内终结编程!
  5. 粤通院 招聘FPGA工程师
  6. 测试计划测试用例及用例评审
  7. 基于51单片机的温湿度检测及调节系统
  8. 远程服务器证书过期怎么解决,关于演示win7远程桌面证书过期的具体操作方式...
  9. 安卓开发中的 “Android高手” ,需要具备哪些技术?
  10. 简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)