图像变换之Census变换

图像的Census变换

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

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

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

 1 void CensusTransform(Mat input_image, Mat &modified_image, int window_sizex, int window_sizey)
 2 {
 3     int image_height=input_image.rows;
 4     int image_width=input_image.cols;
 5
 6     modified_image=Mat::zeros(image_height, image_width, CV_64F);
 7
 8     //-----------census变换  ---------------------------------
 9     int offsetx=(window_sizex-1)/2;
10     int offsety=(window_sizey-1)/2;
11     for(int j = 0; j < image_width - window_sizex; j++)
12     {
13         for(int i = 0; i < image_height - window_sizey; i++)
14         {
15             unsigned long census = 0;
16             uchar current_pixel=input_image.at<uchar>(i+offsety,j+offsetx); //窗口中心像素
17             Rect roi(j, i, window_sizex, window_sizey); //方形窗口
18             Mat window(input_image, roi);
19
20             for(int a = 0; a <window_sizey; a++)
21             {
22                 for(int b = 0; b < window_sizex; b++)
23                 {
24                     if(!(a==offsety && b==offsetx))//中心像素不做判断
25                     {
26                      census = census << 1;//左移1位
27                     }
28                     uchar temp_value = window.at<uchar>(a, b);
29                     if(temp_value <= current_pixel ) //当前像素小于中心像素 01
30                     {
31                         census += 1;
32                     }
33                 }
34             }
35             modified_image.at<double>(i+offsety, j+offsetx) = census;
36         }
37     }
38 }

 

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

          

              

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

 1 // Fast Hamming distance algorithm
 2 unsigned char Hammingdst(long long PL, long long PR)
 3 {
 4     unsigned char number=0;
 5     long long v;
 6     v = PL^PR;            /* ^ 异或运算 不同为1 相同为0*/
 7
 8     while(v)
 9     {
10         v &= (v-1);            /* & 与运算*/
11         number++;
12     }
13     return number;
14 }

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

时间: 2024-10-05 05:41:46

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

【Android】图像变换

源码下载:http://download.csdn.net/detail/jsgaobiao/9510213 ?  [实验目的] 使用A n d r o id系统进行图像变换,图像变换包括形状变换和颜色变换 – 图像变换:平移变换.尺度变换.旋转变换等. – 颜色变换:冰冻效果.融炎效果.漫画效果.羽化效果.缩放模糊效果.LOMO特效.电影效果等 ?  [实验器材] Android Studio 1.5.1 Xiaomi Pad (7.9''): Android 4.4.4 , 1536*204

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

机器视觉算法提纲

图像增强算法(1,2,3,4,5): 对比度增强——空间滤波——彩色变换——多光谱变换——图像运算 几何变换算法(6): 仿射变换原理——投影变换原理——图像变换原理——极坐标变换原理 图像分割算法(7): 阈值分割与亚像素阈值分割——提取图像连通区域 特征提取算法(8): 区域特征——灰度值特征——轮廓特征 形态学算法(9): 区域形态学——灰度值形态学 边缘提取算法(10): 一维边缘提取——二维边缘提取 几何基元的分割与拟合算法(11): 直线拟合——圆拟合——椭圆拟合 摄像机标定算法(1

仿射变换详解 warpAffine

今天遇到一个问题是关于仿射变换的,但是由于没有将仿射变换的具体原理型明白,看别人的代码看的很费解,最后终于在师兄的帮助下将原理弄明白了,我觉得最重要的是理解仿射变换可以看成是几种简单变换的复合实现, 具体实现形式即将几种简单变换的变换矩阵M相乘,这样就很容易理解啦 定义:仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来实现,包括平移,缩放,翻转,旋转和剪切. 这类变换可以用一个3*3

Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation) 2018年11月05日 19:02:44 ethan_1990 阅读数:400 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/rs_lys/article/details/83754473 ??由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能

PyTorch 1.0 中文文档:torchvision.transforms

译者:BXuan694 transforms包含了一些常用的图像变换,这些变换能够用Compose串联组合起来.另外,torchvision提供了torchvision.transforms.functional模块.functional可以提供了一些更加精细的变换,用于搭建复杂的变换流水线(例如分割任务). class torchvision.transforms.Compose(transforms) 用于把一系列变换组合到一起. 参数: transforms(list或Transform对

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

基于YoloV3的实时摄像头记牌器 最终效果 数据准备 数据获取 从摄像头拍摄各种牌型的视频各20秒,不采用人工打标签,而是通过识别出牌的边缘,将牌经过仿射变换矫正,根据牌的实际宽高以及标注位置的实际宽高得到标注位置.通过随机生成背景图片,并且将牌在背景中随机旋转和平移,去掉标注部分被遮挡的生成图片,同时将label也做同样的变换,完成数据集的获取. 先定义好将识别到的卡片zoom到我们希望的宽高: cardW=57#实际宽度 cardH=87#实际高度 cornerXmin=2 #牌的号码距左

利用CNN进行图像分类的流程(猫狗大战为例)

本文旨在总结一次完整的CNN图像分类过程(猫狗大战为例,使用Keras框架),免得经常遗忘.流程包括: 从Kaggle下载猫狗数据集: 利用python的os.shutil库,制作训练集和测试集: 快速开发一个小模型作为基准:(只要效果比随机猜略好即可,通常需要有一点过拟合) 根据基准表现进行改进,比如针对过拟合的图像增强.正则化等. 1 从Kaggle下载猫狗数据集 具体可参考 2 制作数据集 从Kaggle下载的猫狗数据集大概八百多兆,其中训练集包含25000张猫狗图,两类数量各占一半.为了

Duanxx的图像处理学习: 图像变换 三维变换及其齐次坐标表示