图像变换之Census变换
图像的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变换的更多相关文章
- 立体匹配之Census Transform
1.立体匹配算法主要可分为两大类:基于局部约束和基于全局约束的立体匹配算法. (一)基于全局约束的立体匹配算法:在本质上属于优化算法,它是将立体匹配问题转化为寻找全局能量函数的最优化问题,其代表算法主 ...
- SSE指令集优化学习:双线性插值
对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
- GDI+编程小结
GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...
- 仿射变换详解 warpAffine
转自 http://www.cnblogs.com/dupuleng/articles/4055020.html 博客园 首页 新随笔 联系 管理 订阅 随笔- 1 文章- 185 评论- 14 ...
- [视觉] 基于YoloV3的实时摄像头记牌器
基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...
- CNN基础一:从头开始训练CNN进行图像分类(猫狗大战为例)
本文旨在总结一次从头开始训练CNN进行图像分类的完整过程(猫狗大战为例,使用Keras框架),免得经常遗忘.流程包括: 从Kaggle下载猫狗数据集: 利用python的os.shutil库,制作训练 ...
- 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:匹配代价计算之互信息(Mutual Information,MI)
半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...
- 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)
由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示.聚合后的新的代价值保存 ...
随机推荐
- 关于vs2010下水晶报表的使用入门
关于vs2010下使用水晶报表了解情况记录如下: 1.首先vs2010不再自带水晶报表控件了,需要下载安装vs2010配套的水晶报表控件:CRforVS_13_0.这个控件安装很简单,基本上都选择默认 ...
- Android与javascript中事件分发机制的简单比较
在前面两篇博客中,我们讨论了Android中的事件分发的相关内容,那么在本篇博客当中,我们就简单探讨一下html或javascript中的事件分发机制,并进行简单的对比. 在前端中,对事件进行绑定有三 ...
- JavaWeb一小时急速入门总结反思
0.条件一个可以开发javaee的开发工具1.配置首先需要下载tomcat,用来跑javaweb的服务器,下载后自行百度配置.然后需要servlet.jar包,其实就是一个java网络层api包2.基 ...
- Mac Sublime text3 如何设置更加漂亮好用?
说明:配置是根据自己的需求搜索了蛮多博客测试总结的. 显示效果 配置信息: command + , [逗号], 右侧配置信息 { "color_scheme": "Pac ...
- flex盒模型实现头部尾部固定
近期做移动app.wap等站,需要头部固定在顶部,不随着内容滚动而滚动平时第一想法就是使用position:fixed;top:0;z-index:10;这样去实现但这样使用fixed之后,会在ios ...
- IE8及其以下浏览器关于圆角表框的问题
css部分 yuan { border: 2px solid #C0C0C0; -moz-border-radius: 50%; -webkit-border-radius: 50%; border- ...
- ASP.NET MVC 设置区域默认定向
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "m_defau ...
- Gson的学习与使用
Gson介绍: GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串. 特点: a ...
- 删除链表中间节点和a/b处的节点
[题目]: 给定链表的头节点 head,实现删除链表的中间节点的函数. 例如: 步删除任何节点: 1->2,删除节点1: 1->2->3,删除节点2: 1->2->3-& ...
- Java集合系列[1]----ArrayList源码分析
本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组.数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集 ...