仿射变换 c语言,c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式

几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜。在数字图像处理中,几何变换由两个基本操作组成:

(1)坐标的空间变换

(2)灰度内插,即对变换后的像素赋灰度值

坐标变换公式

(x,y) = T{(v, w)}

其中,(v, w)是原图像中像素的坐标,(x, y)是变换后图像中像素的坐标。最常用的空间坐标变换之一是仿射变换

基于上式的仿射变换公式

982f4c93766396e9be6a025b097ff559.png

实际上,我们可以用两种方法来使用上式。第一种方法称为向前映射,它由扫描输入图像的像素,并在每个位置(v, w)用上式直接计算输出图像中相应像素的空间位置(x, y)组成。向前映射算法的一个问题是输入图像中的两个或更多个像素可被变换到输出图像的同一位置,这就产生了如何把多个输出值合并到一个输出像素的问题。第二种方法,反向映射,扫描输出像素的位置,并在每一个位置(x, y)使用(v, w) = T-1(x, y)计算输入图像中的相应位置。然后通过内插决定输出像素的灰度值。本篇文章使用反向映射。

在上一篇文章中,主要是图片的放大与缩小,在灰度内插的过程中也涉及到目标图像到原图像的坐标变换,代码如下

cdd384e6a10477a29cd2bc65e44afafc.png1 void bilinera_interpolation(short** in_array, short height, short width, 

2                             short** out_array, short out_height, short out_width) 3 { 4     double h_times = (double)out_height / (double)height, 5            w_times = (double)out_width / (double)width; 6     short  x1, y1, x2, y2, f11, f12, f21, f22; 7     double x, y; 8  9     for (int i = 0; i 

cdd384e6a10477a29cd2bc65e44afafc.png

其中,第11,12行为目标图像到原图像的坐标变换,接下来根据仿射变换公式对图像做进一步处理

水平偏移变换

水平偏移变换公式为

x = v

y = Sh * v + w

反解上述公式得

v = x

w = y - Sh * v

结果为目标图像到原图像的坐标变换,令Sh = 0.5,并对应用到上述代码11,12行,同时将图像扩大到2800*1280,结果为

9cf20e3999fcaabc490420c33b243e48.png

旋转变换

旋转变换公式

x = vcosθ - wsinθ

y = vsinθ + wcosθ

令θ = ∏/4,反解得

v = x + y

w = y - x

将图像扩大为2000*2000,但是这个时候得到的图像为

cd68a90604dde5a79d3d0379ab011dc3.png

为了解决这一问题,使旋转后的图像位于中央,我将所得图片右移m_w, 下移m_h,则公式变为

x = vcosθ - wsinθ + m_w

y = vsinθ + wcosθ + m_h

令θ = ∏/4,反解得

v = x + y - m_h - m_w

w = y - x - m_h + m_w

结果为

383c64bcd7c48f2c6a6753b0f63e40fc.png

其余变换原理基本相同,因此不再进行演示

打开App,阅读手记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和汇编混合编程----实现浮点数的加减乘除

加法 C程序: #include "stdio.h"int main() {float a1.0;float b2.34;float c;cab;printf("c%f",c);return 0; }反汇编之后,实现加法的关键程序 5: float a1.0; 00401028 C7 45 FC 00 00 80 3F mov dword ptr [eb…

java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

java删除指定索引元素We have to create a List and add objects/elements to the List and given indexes in java. 我们必须创建一个List并将对象/元素添加到该List中,并在Java中添加给定的索引。 To add any object/element at given index to the List, we use…

使用ActiveX读取客户端mac地址

//保存为html文件<HTML><HEAD><TITLE>获取客户端MAC和用户名</TITLE><META http-equivContent-Type content"text/html; charsetgb2312"><SCRIPT languageJScript event"OnCompleted(hResult,pErrorObject, pAsyncContext)&qu…

【Wordpress】分享500多款国外WordPress经典主题 其之三

从国外网站上淘来的WordPress主题&#xff0c;以前都是放在本人博客xcodeland.mooo.com上的后来空间挂掉了就转到这里来与大家分享。 modernclean 下载地址 just-business 下载地址 redrum 下载地址 aneducation 下载地址 artsie 下载地址 eveningalone 下载地址 wasabi …

python 微秒_Python程序可显示当前时,分,秒和微秒

python 微秒In the below example – we are implementing a python program to print current hour, minute, second and microsecond. 在下面的示例中-我们正在实现一个python程序来打印当前时&#xff0c;分&#xff0c;秒和微秒 。 Steps: 脚步&#xff1a; Import the d…

终于知道RTM的含义了

从关注VS 2005开始&#xff0c;注意到RTM、RC这几个缩写&#xff0c;一直没找到是什么意思。今天终于知道了含义&#xff1a;RTM&#xff1a;Release To Manufacturing意味着开发工作已结束, RTM 版将提供给发行商、OEM 硬件厂商、驱动程序开发者、独立软件开发者等。RC&#x…

C和混编混合编程----strcpy缓存溢出原理

今天老师给了一到程序&#xff0c;让我们分析分析原理&#xff0c;关于strcpy缓存溢出原理的&#xff0c;反汇编一遍遍调试&#xff0c;终于看明白了&#xff0c;记录一下 C程序&#xff1a; #include "string.h" #include "stdio.h" char *shellcode&quo…

16进制的简单运算

描述 现在给你一个16进制的加减法的表达式&#xff0c;要求用8进制输出表达式的结果。 输入 第一行输入一个正整数T&#xff08;0< T<100000&#xff09; 接下来有T行&#xff0c;每行输入一个字符串s&#xff08;长度小于15)字符串中有两个数和一个加号或者一个减号&…

逝去的大学生活自己丢了什么

1.一个HP电脑包挂在外面的阳台 2.一个蚊帐 3.乱七八糟的垃圾 4.两双篮球鞋 5.一台电脑桌送给了阿姨&#xff0c;不到一会儿就消失不见了 6.一辆自信车给了好朋友 7.三个水果筐给了阿姨 这么大方的丢东西丢的最多的一次 祭奠我逝去的大学&#xff0c;祭奠我丢失的东西&#xff0…

android 中文api 在线测试,android webview测试方法

利用chromedriver操作webview1.创建chrome serverchromedriver --url-basewd/hub --port9515 --adb-port50372.创建sessionPOST http://127.0.0.1:9515/wd/hub/session参数&#xff1a;{"desiredCapabilities":{"chromeOptions":{"androidPackage&quo…

几篇介绍在页面中引用脚本文件的技术文档

在一个页面中包含一个脚本文档是多么简单的一件事&#xff0c;但今天看了几篇文章后&#xff0c;才发现在一个这么简单的功能也有这么多的技巧可谈&#xff0c;以下是这几篇文章挣脱浏览器的束缚&#xff08;1&#xff09; - 前言挣脱浏览器的束缚&#xff08;2&#xff09; - …

Java StringBuffer insert(int offset,String s)方法,带示例

StringBuffer类insert(int offset&#xff0c;String s) (StringBuffer Class insert(int offset , String s)) This method is available in package java.lang.StringBuffer.insert(int offset, String s). 软件包java.lang.StringBuffer.insert(int offset&#xff0c;Strin…

C和汇编混合编程--------函数调用后ebp、esp值问题

今天老师又给了一个程序&#xff0c;让我们分析&#xff0c;记录一下分析过程 程序&#xff1a; #include "stdio.h" #include "string.h"char *shellcode"\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {print…

C小加 之 随机数

描述 ACM队的“C小加”同学想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;0< N≤100&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同…

How to use fb.data.query to get friends info?

参考代码1&#xff1a; varquery FB.Data.query(select uid, first_name, last_name, work, from user where uid{0}, response.id);query.wait(function(rows) {varloginData {fb_uid: rows[0].uid, first_name: rows[0].first_name, last_nam…

android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)

ListView的主要有两种滑动事件监听方法&#xff0c;OnTouchListener和OnScrollListener1、OnTouchListenerOnTouchListener方法来自View中的监听事件&#xff0c;可以在监听三个Action事件发生时通过MotionEvent的getX()方法或getY()方法获取到当前触摸的坐标值&#xff0c;来对…

获得jmp esp地址

对于大部分想要利用缓冲区溢出的人来说&#xff0c;jmp esp就再熟悉不过了&#xff0c;我最近发现网上将如何如何利用它的人太多太多&#xff0c;可是就是没人告诉在shellcode 中到底jmp esp的地址在哪&#xff0c;有些直接给除了它的地址可是由于jmp esp随系统的不同地址也不同…

TreeView无限极分类绑定(从数据库读取数据源)

TreeView这个控件其实我本来不怎么会用到&#xff0c;今天有一个项目要用到&#xff0c;而且是无限极的分类数据绑定&#xff0c;于是就根据自己以前写过的代码别写出了这个无限极分类的例子&#xff0c;呵呵希望能够对大家有所帮助&#xff0c;本人尽量把注释写的详细一些把&a…

为何把牛奶倒入大海

汤姆是生活在米国乌有城城郊的一位奶牛场主&#xff0c;不知何故&#xff0c;方圆数百里&#xff0c;只有这一家奶牛场。汤姆的奶牛场有2000头奶牛&#xff0c;每月产奶2000吨&#xff0c;这牛奶供应给乌有城的市民和周边的农民。牛奶售价是每吨500美元&#xff0c;每吨牛奶的生…

软件工程 软件设计 步骤_好的软件设计特点 软件工程

软件工程 软件设计 步骤For good quality software to be produced, the software design must also be of good quality. Now, the matter of concern is how the quality of good software design is measured? This is done by observing certain factors in software desi…