分类目录归档:布道

IEEE 754 的 inf 比较问题

首先上结论: 当涉及浮点数比较时,一定要考虑比较符号两侧都是inf的情况.

原因: inf==inf,inf<=inf,inf=inf 这三个比较都为真(-inf同理),而这种结果可能与我们的期望不符.

解决方法:
1. 如果为真是可以接受的,那么直接使用比较运算符,例如a<=b
2. 如果为真是不可以接受的,那么应当使用作差,例如(a-b)<=0, 这种情况下,当a和b都为inf时,inf之间的运算会输出NaN,从而导致比较结果为false

例如,我有这样一个应用场景:

有射线R和两个平面S0及S1,我们需要求射线R与平面S0的交点p0,以及射线R与平面S1的交点P1. 且要求p0不能比p1离射线起点更远(可以重合)

假如我们用直线的参数方程来描述交点,显然,上面的目标很容易用 t0<=t1 … Read More

Python for C++ Programner

这里谈一下个人的学习建议. 首先阅读官方的入门教程, 看完这一部分,对于一个熟练的C++程序员,应该可以凑合写出可堪一用的代码了. 然后是Python in a Nutshell 3rd第七章之前的内容(不含第七章),这一部分看完, 你就能基本了解Python的运行机制, 写出质量合格的代码了(但可能不够Pythonic).

上面两步完成后, 对一个熟悉C++的程序员而言, 基本任何Level的Python资料都可以看了. 如果偏应用,你可以继续看Python in a

Read More

字符集与编码

近义名词

  • 多字节字符(Multibyte char) ~ 变长编码, 一个字符可能由多个字节(字节数不定)表示, 因此每个需要按一定规则添加额外的信息,以分割字符.
  • 宽字节字符(Wide char) ~ 定长编码, 使用定长的字节表示字符,因此字符之间没有额外的分割信息.

字符绘制基础

  • 假设有函数drawChar(charSet,code_point), drawChar将根据(charSet,code_point)两个参数在
Read More

OpenGL Basic

  • 学习现代OpenGL基本上可以分为两个方面: 一方面是熟悉OpenGL的API,另一方面是GLSL语言. 总的来说,OpenGL的API及运行框架是比较简单的,GLSL类似C,虽然语法简单,但是基本所有shading(视觉效果)都要用GLSL写,这个问题的范畴就很大了.本文的重点放在OpenGL API上, 尽量仅使用简单的GLSL着色器.
  • LearnOpenGL CN是一个理论和实践都有阐述的教程,比较适合从0开始快速入门.
  • OpenGL step by step是一个更加专注于代码及实例的教程,还有极客学院翻译版
  • Megabyte OpenGL Tutorial对有一定图形编程基础的开发者而言更简明扼要.

OpenGL的运行模型

  • 从逻辑上看,
Read More

矩阵系统

首先,在集合的基础上,额外定义满足要求1的加法,就形成加群,再额外定义满足要求2的数乘,就形成向量空间,再额外定义满足要求3的向量内积,就形成了内积空间。
在这里,我们只需要基于向量空间就可以研究一种重要的映射:线性映射,可以说它是代数系统中最重要的映射方法。
经过分析,我们进一步可以知道线性映射所在的映射空间总是可以与矩阵空间同构,每一个线性映射因此可以利用矩阵进行研究。
所以可以简单的说,研究向量空间间的线性映射,其实就是研究矩阵,矩阵线性映射
从映射角度看,所有线性映射问题都可以通过矩阵进行研究,实现了形式的统一和简化。
从矩阵角度看,所有矩阵都可以经过分析转化为从某空间到另一空间的映射,进而把矩阵问题可以转化为更加基本的映射问题,拓展解决问题的思路。

线性代数基础概念

Read More

图像的简单相位配准 with MATLAB

相位配准概述
相位配准是一种非常经典的理论,理论论述互联网上有很多,我直接给出一个流程图,简述重点。

算法流程图

  • 相位配准的原始理论互联网上已经很多,我不过多赘述,使用完全相同的两个图像在空间内平移进行推导。只强调一下,在实际使用时,可以证明,只要两个图像有完全相同的部分,那么就可以使用相位配准
    结论图像
  • 带有旋转/缩放的相位配准不要看普通教材,普通教材愚蠢的试图先绕图像中心旋转缩放,再进行平移。事实上,只要有空间变换(或刚体运动学)知识,就可以知道如果刚体可以仅通过缩放和旋转从A变为B,那么必然可以确定一个空间点O,使刚体A仅绕O进行一次缩放和一次旋转到达B,也就是说,只要我们确定了点O,那么进行对数极换元就可以直接确定旋转和缩放参数。
  • 如果只是绕中心旋转的图片,那么做对数极换元,再做平移的相位配准即可,我必须说,这毫无意义,这里面的工作最大头为对数极换元,which和图像处理没有什么关系。
  • MATLAB 2014a后自带了一个 imregcor 函数,它对重合区域较大(目测至少20%)的两个图像进行相位配准非常高效,平移,旋转 缩放都OK。本文末尾附带的是一个我的实现,它的重难点在于附带了一个图像拼接程序,要比相位配准中求出坐标更复杂。

function runrun()
PhCorrelationRotation('cameraman.png','cameraman_part_rotate_scaling.png',0)
end

function PhCorrelationRotation(baseimgpath,sampleimgpath,deltaH)
if 
Read More