【数字图像处理】图像几何变换之 图像的极坐标变化展开鱼眼图
(一)基础知识
极坐标变换及其反变换的关键在于,根据极坐标变换前的图像(我们称为“圆图”)确定极坐标变换后的图像(我们称为“方图”)上每个像素点的像素值。也即是找到“圆图”和“方图”间几何坐标的对应关系。
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。
图像变换过程可以参考
- 图像的极坐标变换
- 图像极坐标变换
- 虹膜图像处理程序
(二)软件设计
因为这个代码时应用于嵌入式平台必须考虑到计算速度的问题,所以这里我们自己实现三角函数的近似计算缺点在于,边界点可能会出现失真。
/*** @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
【数字图像处理】图像几何变换之 图像的极坐标变化展开鱼眼图相关推荐
- 数字图像处理笔记-02(图像空域增强技术及联合运用)
数字图像处理笔记-02(图像空域增强技术及联合运用) (一) 图像增强 1.1 基本概念 由于图像在传输或者处理过程中会引入噪声或使图像变模糊,从而降低了图像质量,甚至淹没了特 征,给分析带来了困难. ...
- 本科课程【数字图像处理】实验3 - 图像的几何变换
大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...
- 数字图像处理与Python实现-图像几何变换-图像金字塔
图像金字塔 图像金字塔 1. 前言 高斯图像金字塔 代码实现: 1. 前言 有些情况下,我们需要处理源自同一张图像的不同分辨率的图像集合.这些不同分辨率的图像组成的集合称为图像金字塔.图像金字塔就是用 ...
- [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- 【数字图像处理】实验一图像基本变换(MATLAB实现)
目录 一.实验意义及目的 二.实验内容 三.Matlab 相关函数介绍 四.参考代码 五.运行结果 六.实验要求 (1)将彩色图像采用不同的灰度化方法实现灰度化: (2)将彩色图像变换到 YCbCr. ...
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换 ...
- 以窗口形式进行数字图像处理时,在图像边界处对超出图像边界的窗口内容的映射(对称)处理
在数字图像处理时,我们经常会以窗口的形式进行相关的运算,如滤波处理,而在图像边界处,窗口可能太大以至于超出边界,这时候我们可以做一个映射(对称)处理,来补齐窗口中超出图像边界的部分.如下图,窗口大小是 ...
- 数字图像处理、拼接,图像静态滤镜(GPUImage/GPU加速) - Android
图像滤镜处理的两种方式:RGB点乘运算:GPU的矩阵运算(效率更高).图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片:矩阵~利用矩阵计算得到新的矩阵修改图片. 几个图像像素 ...
- Matlab数字图像处理 实验3、图像边缘检测的计算机实现
子曰:桃李不言,下自成蹊. 图 像 边 缘 检 测 的 计 算 机 实 现 图像边缘检测的计算机实现 图像边缘检测的计算机实现 P a r t . 0 实 验 目 的 仅 限 于 学 习 交 流 Pa ...
最新文章
- antd 表单提交,文件和表单内容一起提交,表单校验
- 易点租加速电脑租赁市场布局
- matplotlib的下载和安装方法
- 北邮校园网自动登录 python
- mysql dump gtid_mysqldump导出数据备份 --set-gtid-purged=OFF
- 怎么让程序后台运行_CPU中的程序是怎么运行起来的?
- Java中的安全加密
- GitGithub学习笔记
- 竞价推广经验分享 账户的搭建方法
- iOS 6 SDK: 在应用内展示App Store
- 什么是 Python 编程语言?
- Python基础项目:超市购物管理系统
- [BZOJ3653]谈笑风生 主席树
- kubernetes部署分布式存储longhorn
- 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)
- html边框显示长短调整,CSS之border边框长度控制
- jude(java建模软件)_JUDE(JAVA建模软件)
- Springer 参考文献显示?
- 业务规则引擎:Code Effects 5.X Crack-New
- Java安全攻防之从wsProxy到AbstractTranslet
热门文章
- 阿里巴巴年报来了,一天收入6.85亿
- 高德地图插件的简单使用
- Uniapp微信小程序视频全屏播放功能极简实现法
- Google 工程主管:AIGC 将在三年内终结编程!
- 粤通院 招聘FPGA工程师
- 测试计划测试用例及用例评审
- 基于51单片机的温湿度检测及调节系统
- 远程服务器证书过期怎么解决,关于演示win7远程桌面证书过期的具体操作方式...
- 安卓开发中的 “Android高手” ,需要具备哪些技术?
- 简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)