图像变换之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可以作为像素点匹配程度的判断。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

机器学习笔记——特征标准化

数据标准化是为了消除不同指标量纲的影响,方便指标之间的可比性,量纲差异会影响某些模型中距离计算的结果。

13730
来自专栏Pytorch实践

Pytorch实现Logistic回归二分类

? 摘要:本文主要介绍使用深度学习框架Pytorch实现简单的Logistic回归模型,进而实现简单的分类问题。 一.逻辑回归简述 逻辑回归实质上是线性回...

1.4K140
来自专栏机器学习算法原理与实践

K近邻法(KNN)原理小结

    K近邻法(k-nearest neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用。比如,我们判断一个人的人品,...

16050
来自专栏专知

理解多层CNN中转置卷积的反向传播(附代码)

1.8K30
来自专栏Petrichor的专栏

Image Segmentation(图像分割)综述

59930
来自专栏烂笔头

机器学习笔记—KNN算法

目录[-] 前言 分类(Classification)是数据挖掘领域中的一种重要技术,它从一组已分类的训练样本中发现分类模型,将这个分类模型应用到待分类的样...

571100
来自专栏贾志刚-OpenCV学堂

VGG卷积神经网络模型解析

一:VGG介绍与模型结构 VGG全称是Visual Geometry Group属于牛津大学科学工程系,其发布了一些列以VGG开头的卷积网络模型,可以应用在人脸...

56040
来自专栏Petrichor的专栏

深度学习: Faster R-CNN 网络

网络结构有两种,一种是将ZFNet(扔掉了尾端的全连接层)拿来用,另一种则是将VGG拿来用(扔掉了尾端的全连接层)。论文中给出的是第一种(绿框内为拿来用的那部分...

1.5K40
来自专栏机器学习算法与Python学习

CNN之卷积层

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 前言 卷积神经网络在深度学习领域是一...

37470
来自专栏云时之间

深度学习与TensorFlow:FCN论文翻译(二)

Each layer of data in a convnet is a three-dimensional array of size h × w × d, ...

23820

扫码关注云+社区

领取腾讯云代金券