简单的图像几何校正

几何校正是指遥感成像过程中,受多种因素的综合影响,原始图像上地物的几何位置、形状、大小、尺寸、方位等特征与其对应的地面地物的特征往往是不一致的,这种不一致就是几何变形,也称几何畸变。

几何校正是遥感中的专业名词。一般是指通过一系列的数学模型来改正和消除遥感影像成像时因摄影材料变形、物镜畸变、大气折光、地球曲率、地球自转、地形起伏等因素导致的原始图像上各地物的几何位置、形状、尺寸、方位等特征与在参照系统中的表达要求不一致时产生的变形。

———— 百度百科

投影变换几何校正

参考博客:https://blog.csdn.net/weixin_37195422/article/details/53930891

不过此博客未给出相应实践,所以自己实践一个

实践

因为要使用图像处理,以及矩阵和求解线性方程组,所以需要外部库(也可以纯自己弄,不过很麻烦)

图像库:stb_image ,我的这篇博有说https://blog.csdn.net/qq_40953281/article/details/87902580

矩阵计算库:Eigen, 推荐的教程https://zzk.cnblogs.com/s?w=blog%3Ahoukai%20Eigen

这两个都是只需要导入头文件就可以,不需要配置其他的东西,简单易用

参考博客里面的图片是CSDN压缩过的了,像素信息已经改变,新参数如下

  • 规格 383*268

  • x0

    39 82
    32 106
    266 90
    270 54

  • x1

    38 55
    38 100
    270 100
    270 55

代码如下

#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>
#include <Eigen3/Dense>#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>using namespace std;
using namespace Eigen;string filePath;
int w, h, n;
const int points = 4;
vector<pair<int, int>> rectBefore;  // 变换前的四边形
vector<pair<int, int>> rectAfter;   // 变换后的矩形位置
Vector4d cX,cY;                     // x,y对于的四个参数void copyTo(unsigned char *src, int x0, int y0, unsigned char *des, int x1, int y1) {if ((x1 < 0 || x1 >= w) || (y1 < 0 || y1 >= h)) return; // 出界不考虑if ((x0 < 0 || x0 >= w) || (y0 < 0 || y0 >= h)) return; // 出界不考虑for (int i = 0; i < n; i++) {des[w*n*y1 + n * x1 + i] = src[w*n*y0 + n * x0 + i];}
}pair<int,int> getPos(int x, int y) {int x1 = cX[0] * x + cX[1] * y + cX[2] * x*y + cX[3];int y1 = cY[0] * x + cY[1] * y + cY[2] * x*y + cY[3];return make_pair(x1, y1);
}int main()
{cin >> filePath;unsigned char *data = stbi_load(filePath.c_str(), &w, &h, &n, 0);unsigned char *copy = NULL;if (data == NULL) {cout << stbi_failure_reason() << endl;}else {// 复制一份变换用copy = (unsigned char*)malloc(w*n*h);memset(copy, 0, w*n*h);// 获取变换前坐标for (int i = 0; i < points; i++) {int x, y; cin >> x >> y;rectBefore.push_back(make_pair(x, y));}// 获取变换后坐标,与上一一对应for (int i = 0; i < points; i++) {int x, y; cin >> x >> y;rectAfter.push_back(make_pair(x, y));}Matrix4d mid;  // 中间矩阵Vector4d resX, resY; // 转换后的xy坐标for (int i = 0; i < 4; i++) {mid(i, 0) = rectBefore[i].first;mid(i, 1) = rectBefore[i].second;mid(i, 2) = rectBefore[i].first*rectBefore[i].second;mid(i, 3) = 1;resX(i) = rectAfter[i].first;resY(i) = rectAfter[i].second;}// 求解线性方程组cX = mid.lu().solve(resX);cY = mid.lu().solve(resY);// 开始转换for (int i = 0; i < w; i++) {for (int j = 0; j < h; j++) {pair<int, int> newPos = getPos(i, j);copyTo(data, newPos.first, newPos.second, copy, i, j);}}stbi_write_png("out.png", w, h, n, copy, 0);stbi_image_free(data);free(copy);}system("pause");return 0;
}

效果如下

双重水印了。。

简单的图像几何校正实践相关推荐

  1. QT开发实践之简单的图像视频处理软件

    引言   这学期学习了QT桌面应用程序开发基础,实践课我选择做了一个简单的图像图像视频处理软件(灰度化.边缘检测等等),其中视频的读取我是选用了摄像头的读取(方便). 效果图   主界面   处理效果 ...

  2. 图像几何校正-- -- -- 投影变换

                        图像几何校正-- -- -- 投影变换 2016即将过去,回顾一年的时光(此处应有哔....).从进入实验室开始和老师,师兄们一起做图像到现在工作.一直想写 ...

  3. 四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。

    四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...

  4. 四种简单的图像显著性区域特征提取方法----- AC/HC/LC/FT。

    四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...

  5. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面

    <基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...

  6. pilt图像处理_Python用Pillow(PIL)进行简单的图像操作

    安装 pip install pillow Image类 可以说是(PIL:Python Image Library)里最重要的一个类了,该类存在于同名的模块中.可以通过以下几种方式实例化:从文件中读 ...

  7. OpenCV GPU 简单遍历图像

    OpenCV GPU  简单遍历图像 [cpp] view plaincopy print? #include "cuda_runtime.h" #include "de ...

  8. python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  9. erdas2015几何校正模块在哪_erdas图像几何校正操作步骤指南

    图像几何校正 1.图像几何校正的途径 ERDAS图标面板工具条:点击DataPrep图标,→Image Geometric Correction →打开Set Geo-Correction Input ...

最新文章

  1. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
  2. java 数组 反射_java数组的反射
  3. TokuDB介绍——本质是分形树(一个叶子4MB)+缓存减少写操作
  4. 2022-03-19
  5. 为什么B+树比B树更适合做数据库索引
  6. Tcode SCU3查看table log的error message - 如何查找necessary PFCG role
  7. 【Python】ffmpeg模块查询视频、音频信息
  8. Flex RemoteClass ActionScript类与Java类的绑定
  9. 详解工作流框架Activiti的服务架构和组件
  10. 关闭切换大小写提示_你不知道的iOS 13提示和技巧
  11. python官方文档怎么样_python官方文档
  12. 【译】AS3利用CPU缓存
  13. XXXX软件项目系统测试报告
  14. 免费且快速搭建个人www服务器的教程
  15. TCP Socket通信详细过程
  16. SQL中Date 函数
  17. 时序分析基本概念介绍--Timing Arc
  18. Golang修改图片JPEGjpg的大小和质量
  19. 我成为了CSDN优秀资源分享达人
  20. I2S协议和hisi3520调试TLV320AIC3101音频驱动(一)

热门文章

  1. Windows本地下载远程服务器文件方法总结
  2. sklearn.svm中LinearSVR(svm线性回归)、LinearSVC(svm线性分类)与SVC(svm分类)、SVR(svm回归)之间的区别
  3. Python遥感影像SAR分割裁剪多张小影像
  4. 使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品
  5. ICMP协议服务器怎么开启关闭ICMP协议?
  6. 秋招提前批已来,万字长文教你如何增加面试大厂的成功率
  7. 安卓自动操作软件 AUTO.JS 4.1.1 ALPHA2 免费版下载
  8. 访问控制模型总结(DAC MAC RBAC ABAC)
  9. 以太网、局域网、广域网、因特网、互联网与万维网
  10. Xen - Networking