图像处理中的census变换

    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)

MATLAB Code
*************************************************************************
Title: Function-Census Transform of 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 

你可能感兴趣的:(立体视觉,学习)