图像的Census变换

Census变换属于非参数图像变换的一种,它能够较好地检测出图像中的局部结构特征,如边缘、角点特征等。传统Census变换的基本思想是:在图像区域定义一个矩形窗口,用这个矩形窗口遍历整幅图像。选取中心像素作为参考像素,将矩形窗口中每个像素的灰度值与参考像素的灰度值进行比较,灰度值小于或等于参考值的像素标记为0,大于参考值的像素标记为1,最后再将它们按位连接,得到变换后的结果,变换后的结果是由0和1组成的二进制码流。Census变换的实质是将图像像素的灰度值编码成二进制码流,以此来获取邻域像素灰度值相对于中心像素灰度值的大小关系。变换过程可通过如下公式表达:

其中p是窗口中心像素,q是窗口中心像素以外的其他像素,Np表示中心像素p的邻域。I(*)表示像素点*处的灰度值。

给出实现Census变换的实现函数如下:

 void CensusTransform(Mat input_image, Mat &modified_image, int window_sizex, int window_sizey)
{
int image_height=input_image.rows;
int image_width=input_image.cols; modified_image=Mat::zeros(image_height, image_width, CV_64F); //-----------census变换 ---------------------------------
int offsetx=(window_sizex-)/;
int offsety=(window_sizey-)/;
for(int j = ; j < image_width - window_sizex; j++)
{
for(int i = ; i < image_height - window_sizey; i++)
{
unsigned long census = ;
uchar current_pixel=input_image.at<uchar>(i+offsety,j+offsetx); //窗口中心像素
Rect roi(j, i, window_sizex, window_sizey); //方形窗口
Mat window(input_image, roi); for(int a = ; a <window_sizey; a++)
{
for(int b = ; b < window_sizex; b++)
{
if(!(a==offsety && b==offsetx))//中心像素不做判断
{
census = census << ;//左移1位
}
uchar temp_value = window.at<uchar>(a, b);
if(temp_value <= current_pixel ) //当前像素小于中心像素 01
{
census += ;
}
}
}
modified_image.at<double>(i+offsety, j+offsetx) = census;
}
}
}

 

拿两张图像做个试验, 如下:

          

              

如上图所示可以分别得到两幅Census变换后的图像,在立体匹配的计算匹配代价部分可以利用这两幅图像计算图像的匹配程度,通常是计算汉明距离hammingDst。函数实现如下:

 // Fast Hamming distance algorithm
unsigned char Hammingdst(long long PL, long long PR)
{
unsigned char number=;
long long v;
v = PL^PR; /* ^ 异或运算 不同为1 相同为0*/ while(v)
{
v &= (v-); /* & 与运算*/
number++;
}
return number;
}

输入为两幅图像对应像素点处的二进制码流,输出为两个二进制码流的异或结果中1的个数。用这个number可以作为像素点匹配程度的判断。

图像变换之Census变换的更多相关文章

  1. 立体匹配之Census Transform

    1.立体匹配算法主要可分为两大类:基于局部约束和基于全局约束的立体匹配算法. (一)基于全局约束的立体匹配算法:在本质上属于优化算法,它是将立体匹配问题转化为寻找全局能量函数的最优化问题,其代表算法主 ...

  2. SSE指令集优化学习:双线性插值

    对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...

  3. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  4. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  5. 仿射变换详解 warpAffine

    转自 http://www.cnblogs.com/dupuleng/articles/4055020.html 博客园 首页 新随笔 联系 管理 订阅 随笔- 1  文章- 185  评论- 14  ...

  6. [视觉] 基于YoloV3的实时摄像头记牌器

    基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...

  7. CNN基础一:从头开始训练CNN进行图像分类(猫狗大战为例)

    本文旨在总结一次从头开始训练CNN进行图像分类的完整过程(猫狗大战为例,使用Keras框架),免得经常遗忘.流程包括: 从Kaggle下载猫狗数据集: 利用python的os.shutil库,制作训练 ...

  8. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:匹配代价计算之互信息(Mutual Information,MI)

      半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...

  9. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

      由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示.聚合后的新的代价值保存 ...

随机推荐

  1. php消息队列之 think queue消息队列初体验

    使用thinkphp 5的  消息队列 think queue ● php think queue:listen --queue queuename ● php think queue:work -- ...

  2. 队列详解及java实现

    导读 栈和队列是有操作限制的线性表. 目录 1.队列的概念.特点.存储结构. 2.栈队列的java实现. 概念 队列是一种在一端进行插入,而在另一端进行删除的线性表.1.队列的插入端称为队尾:队列的删 ...

  3. composer安装laravel

    安装composer composer是一个很有用的工具,我将用它在本机(win7)上安装laravel 到composer的官网,根据自己的系统要求下载相应的版本 安装laravel 首先cmd下进 ...

  4. VS2010 Extension实践(2)

    在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI:在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的 ...

  5. 读书笔记:《HTML5开发手册》-- 现存元素的变化

    继续学习HTML5语义化的内容,今天主要介绍一下,HTML5之前的元素经HTML5规范后的语义及一些使用示例. 一.cite HTML5对cite元素的定义进行了很大的修改,在HTML4中,cite元 ...

  6. python 模块:xlrd && xlwt

    主要来自:http://www.jb51.net/article/60510.htm python读excel--xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本 ...

  7. CheckForIllegalCrossThreadCalls = false

    多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制. 这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为f ...

  8. SpringCloud学习笔记(5)——Config

    参考Spring Cloud官方文档第4~10章 官网文档中所有示例中的配置都在git上 https://github.com/spring-cloud-samples/config-repo Par ...

  9. OpenCV探索之路(二):图像处理的基础知识点串烧

    opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...

  10. Lambda表达式基础

    1.委托的典型用法 1.1定义一个委托: public delegate int AddDelegate(int i, int j); 1.2 定义一个MyClass类,放置一个满足 AddDeleg ...