亚像素Sub Pixel

评估图像处理算法时,通常会考虑是否具有亚像素精度。

亚像素概念的引出:

图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和CCD相机的分辨率能力;另一种是引入亚像素细分技术来弥补硬件的不足以提高图像系统的分辨率。

如使用亚像素细分技术将精度提到到0.01像素,就相当于提高了100倍的图像系统分辨率。

[分辨率可以从显示分辨率与图像分辨率两个方向来分类。

显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。
图像分辨率则是单位英寸(PPI,pixel per inch)中所包含的像素点数,其定义更趋近于分辨率本身的定义。]

优点:大大节省系统的硬件投入成本,降低技术应用的难度,扩大其应用范围。

亚像素细分技术最早是由Hueckel M F在a local visual operator which recognizes edges and lines中提出。目前此技术已取得了很好的成果。

  1. 亚像素定义:

    像素是成像面的基本单位也是最小单位,通常被称为图像的物理分辨率。

    如130万像素为1280*1024;

    如果成像系统要显示的对象尺寸小于物理分辨率时,成像系统是无法正常辨识出来的。

    实际上,亚像素细分算法是软件上对物理分辨率的近似优化结果。

    例如:某CMOS成像芯片,其像素间距为4.5um。在成像时,对物理世界中连续的图像进行了离散化处理,这时成像面上每一个像素点只代表其附近的颜色。

    而两个像素之间有4.5um的距离,在宏观上可以看作是连在一起的,但在微观上它们之间还有无限更小的东西存在,是两个物理像素之间的“像素”,这些更小的东西就称为“亚像素”。

    【注】:实际上,“亚像素”应该是存在的,只是硬件上没有比像素更细微的传感器把它检测出来而已,于是在软件上把它可以近似地计算出来。

    亚像素精度是指相邻两像素之间细分情况。输入值通常为二分之一,三分之一或四分之一。这意味着每个像素将被分为更小的单元从而对这些更小的单元实施插值算法。例如,如果选择四分之一,就相当于每个像素在横向和纵向上都被当作四个像素来计算。因此,如果一张5x5像素的图像选择了四分之一的亚像素精度之后,就等于创建了一张16x16的离散点阵,进而对该点阵进行插值。

    插值: 在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。插值:用来填充图像变换时像素之间的空隙。

  2. 简单示例来说明一下:

    如下图所示:

    较大的点是真实的物理像素点,在物理像素点之间较小的点是亚像素点。

    假设:在理想成像条件下,一个点经过数字化后,在数字图像上表现为四个物理像素点的矩形,下图所示,左上角的四个标记1,2,3,4围起来的矩形所示。

    如果取整像素值作为目标的中心坐标,

    与采用亚像素方法求出的中心坐标相差0.5个物理像素。

  3. 亚像素算法的建立和选择:

    亚像素定位算法的前提条件是:目标不是孤立的单个像素点,而必须是由一定灰度分布和形状分布的一系列像素点组成。

    一般要经过三个步骤:

    ① 粗定位过程:

    对检测的目标进行初步定位,得到像素的精度;

    ② 确定搜索范围:

    为了提高精度和降低运算量,在目标位置附近选择合适大小的小领域区域作为分析的搜索区域。

    ③ 细定位过程

    根据区域特点,选择合适的亚像素算法进行细定位分析以得到亚像素的精度。

  4. 亚像素细分算法

    ①:几何方法

    利用图像中某一目标的几何特征得到亚像素的测量数据,一般是规则形状的目标,如圆,三角形、正方形等形状。

    常见的几何方法有形心法和灰度重心法

    形心法是对图像中圆、椭圆和矩形等中心对称的目标进行高精度定位的最简单的亚像素算法。

    由于形心法是根据被测目标的几何特性来确定位置,所以需要对图像进行二值化运算,识别 出要处理的目标区域。同时,此算法也要求目标图像的干扰噪声尽可能小,这样就不会产生 太大的误差,一般可进行图像预处理来减少误差的产生。当目标图像的对比度较好时,形心法的精度可以达到0.1个像素。

    灰度重心法是基于形心法的基本原理而形成的常用亚像素算法。

    在图像的亚像素级边缘提取中,它看成是以灰度或灰度的导数为权值的加权重心。它的好处在于算法充分利用了对称目标中每一点的灰度值,通常可获得比形心法更高的定位精度。

    ②:矩估计方法

    矩估计方法是目前亚像素算法中研究最广泛,应用最多的方法。由于矩是基于积分的运算, 因此矩也被认为是对噪声不敏感的稳定特征,同时矩还具有被测目标的矩特性在成像前后 保持不变的性质。根据矩的这种显著特点可以采用模板运算的方式对物体形状的边缘进行 亚像素细分。常见的算法有空间矩、灰度矩和ZOM正交矩等。

    ③:插值法

    线性插值是插值算法中最简单的一种。毫无疑问,它是通过等间隔的线性插值算法来实现对边缘过渡的细分。因此,其算法最为简单,速度快,但精度也不高。

    多项式插值法则改善了线性插值的缺陷,它采用了多项式插值函数来对边缘进行亚像素细分。

  5. 实践中,

    许多算法,都具有亚像素精度;对算法进行评估的一个指标是是否具有亚像素精度。

    这是什么意思呢?

    可以这样理解:图像采用某种算法,一般得出的像素坐标为整数int(x,y);但是如果得出的像素坐标不是整数如float(x,y);即数值计算的结果不为整数;可以说成算法具有亚像素精度(Sub Pixel Accuracy)的优点。

    计算的数值比整数值更为精确,如果需要得出整数,可以把返回的小数值近似为最接近的整数。

 
 
 
 

亚像素Sub Pixel的更多相关文章

  1. 寻找Harris、Shi-Tomasi和亚像素角点

    Harris.Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘.角点.斑点). 一.Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出 ...

  2. OpenCV亚像素角点cornerSubPixel()源代码分析

    上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点.但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角 ...

  3. Paper | 亚像素运动补偿 + 视频超分辨

    目录 1. ABSTRACT 2. INTRODUCTION 3. RELATED WORKS 4. SUB-PIXEL MOTION COMPENSATION (SPMC) 5. OUR METHO ...

  4. OpenCV亚像素级的角点检测

    亚像素级的角点检测 目标 在本教程中我们将涉及以下内容: 使用OpenCV函数 cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置). 理论 代码 这个教程 ...

  5. opencv亚像素级角点检测

    一般角点检测: harris cv::cornerHarris() shi-tomasi cv::goodFeaturesToTrack() 亚像素级角点检测是在一般角点检测基础之上将检测出的角点精确 ...

  6. 【工程应用七】接着折腾模板匹配算法 (Optimization选项 + no_pregeneration模拟 + 3D亚像素插值)

    在折腾中成长,在折腾中永生. 接着玩模板匹配,最近主要研究了3个课题. 1.创建模型的Optimization选项模拟(2022.5.16日) 这两天又遇到一个做模板匹配隐藏的高手,切磋起来后面就还是 ...

  7. Firemonkey Bitmap 设定像素颜色 Pixel

    VCL 和 Firemonkey 的 Bitmap 处理像素的方式不相同,下例为将图片内不是「白色」的像素全部改成「黑色」: procedure TForm1.Button1Click(Sender: ...

  8. OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  9. Opencv 亚像素级别角点检测

    Size winSize = Size(5,5); Size zerozone = Size(-1,-1); TermCriteria tc = TermCriteria(TermCriteria:: ...

随机推荐

  1. c++复习:STL之容器

    1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...

  2. CSS: Position Introduction.

    brief introduction: detailed introduction: ①absolute locate:http://www.runoob.com/try/try.php?filena ...

  3. ajax分页代码

    <meta charset="utf-8"><?php//连接数据库$link = mysqli_connect('127.0.0.1','root','root ...

  4. CHAR 和VARCHAR的区别

    CHAR(10)是不可变长度为10的字符串,占的存储空间始终为10个字符的长度,而VARCHAR(10)是可变长度的字符串,故而可以节省空间.例如:储存"aaaaabbbbb",则 ...

  5. Android Studio3.1.2编译时Java Compiler出错:Warning: Failed to parse host proxy3.bj...

    删除gradle.properties中的代理设置... #移除下面配置systemProp.http.proxyHost=proxy3.bj.petrochina systemProp.http.p ...

  6. delphi控制本计算机和远程计算机关机等

    unit mainunit; {远程关机源码} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Con ...

  7. CentOS6开启BBR加速

    BBR TCP加速,Google出品神器,需 kernel 4.9以上.开启后服务器的访问明显快很多,对于vultr和digitalocean这种国外服务器很适合,感觉使用后Shell输入也没那么卡了 ...

  8. java 导包

    在maven 中搜索相关模块依赖 http://mvnrepository.com/artifact/org.apache.spark/spark-mllib_2.10/1.0.0 dependenc ...

  9. TensorFlow 语法

    dataset = tf.data.TextLineDataset(file_path) 生成一个dataset,dataset中的每一个元素就对应了文件中的一行

  10. java-学习7

          数组的定义及使用 public class TestArr { public static void main(String[] args) { //声明数组 double array1[ ...