Census变换是一种非参数的局部变换(即依赖于局部强度值的相对顺序,而不是强度值本身)。census变换用于图像处理中,将方形窗口内的像素的强度值映射到一个比特串,从而捕捉图像的结构。中心像素的强度值将被这个比特串所代替,这个比特串由一组布尔值的比较得到,例如,在一个正方形窗口中,从左边移动到右边。
if(当前像素强度值<中心像素强度值)布尔型 bit=0
else 布尔型 bit=1
对于每一个比较,比特串被移动到左边。对于3*3大小的census窗口,形成一个8位的比特的串;对于5*5大小的census窗口,形成一个32位的比特串。
优势:
减少由相机的增益和偏置引起的变化的影响。
对于接近深度不连续区域的外点,提高其鲁棒性。
编码局部空间结构。
宽容的派性(如果局部领域的少数像素和大多数的像素比较,有一个非常不同的强度分布, 只有涉及到这些少数像素的比较受影响)。
它可以区分旋转和反射。
缺点:
与像素相关联的信息的丢失。
随着窗口的大小增加,变量的大小的要求也增加了。
对于一个3*3大小的census窗口,用于存储census值的大小为23,或者8位;对于一个5*5大小的census窗口,用于存储census值的大小为25,或者32位。
例子:
Sample Image-Cones |
Census Transform (3×3) |
Census Transform (5×5) |
% *************************************************************************
% Title: Function-Census Transform of a given Image
% Author: Siddhant Ahuja
% Created: May 2008
% Copyright Siddhant Ahuja, 2008
% Inputs: Image (var: inputImage), Window size assuming square window (var:
% windowSize) of 3x3 or 5x5 only.
% Outputs: Census Tranformed Image (var: censusTransformedImage),
% Time taken (var: timeTaken)
% Example Usage of Function: [a,b]=funcCensusOneImage('Img.png', 3)
% *************************************************************************
function [censusTransformedImage, timeTaken] = funcCensusOneImage(inputImage, windowSize)
% Grab the image information (metadata) using the function imfinfo
try
imageInfo=imfinfo(inputImage);
% Since Census Transform is applied on a grayscale image, determine if the
% input image is already in grayscale or color
if(getfield(imageInfo,'ColorType')=='truecolor')
% Read an image using imread function, convert from RGB color space to
% grayscale using rgb2gray function and assign it to variable inputImage
inputImage=rgb2gray(imread(inputImage));
else if(getfield(imageInfo,'ColorType')=='grayscale')
% If the image is already in grayscale, then just read it.
inputImage=imread(inputImage);
else
error('The Color Type of Input Image is not acceptable. Acceptable color types are truecolor or grayscale.');
end
end
catch
inputImage=inputImage;
end
% Find the size (columns and rows) of the image and assign the rows to
% variable nr, and columns to variable nc
[nr,nc] = size(inputImage);
% Check the size of window to see if it is an odd number.
if (mod(windowSize,2)==0)
error('The window size must be an odd number.');
end
if (windowSize==3)
bits=uint8(0);
% Create an image of size nr and nc, fill it with zeros and assign
% it to variable censusTransformedImage of type uint8
censusTransformedImage=uint8(zeros(nr,nc));
else if (windowSize==5)
bits=uint32(0);
% Create an image of size nr and nc, fill it with zeros and assign
% it to variable