计算图像的局部三元模式?

时间:2014-11-28 14:43:18

标签: matlab image-processing

我正在计算图像的局部三元模式。我的代码如下。我是否朝着正确的方向前进?

function [ I3 ] = LTP(I2)
     m=size(I2,1);
     n=size(I2,2);
    for i=2:m-1
        for j=2:n-1
            J0=I2(i,j);
            I3(i-1,j-1)=I2(i-1,j-1)>J0;
        end
    end

I2是LTP应用的图像。

1 个答案:

答案 0 :(得分:2)

这不是很正确。这是LTP的示例,给出了3 x 3图像补丁和阈值t

将窗口中的像素指定为0的范围是阈值介于c - tc + t之间,其中c是像素的中心强度。因此,因为该窗口中心的强度为34,所以范围在[29,39]之间。任何超出39的值都会被赋值为1,而任何低于29的值都会被赋值为-1。确定三元代码后,将代码分为上下两种模式。基本上,任何被赋值为-1的值都被赋值为0用于高级模式,而任何被赋值为-1的值都被赋予1用于低级模式。此外,对于较低的模式,原始窗口中任何1的值都会映射到0.最后的模式是从东部位置开始相对于中心(第2行,第3列)读取位模式,然后四处走动逆时针。因此,您可能应该修改您的功能,以便在图像中同时输出较低模式和较高模式。

让我们编写代码的更正版本。请记住,我不会给出优化版本。让我们来一个基本的算法,它将取决于您如何优化它。因此,请将您的代码更改为类似的内容,同时牢记我上面谈到的所有内容。顺便说一下,你的功能没有正确定义。您不能使用空格来定义您的函数以及变量。它会将空格中的每个单词解释为变量或函数,而这并不是你想要的。假设您的邻域大小为3 x 3且图像为灰度,请尝试以下方法:

function [ ltp_upper, ltp_lower ] = LTP(im, t)

    %// Get the dimensions
    rows=size(im,1);
    cols=size(im,2);

    %// Reordering vector - Essentially for getting binary strings
    reorder_vector = [8 7 4 1 2 3 6 9];

    %// For the upper and lower LTP patterns
    ltp_upper = zeros(size(im));
    ltp_lower = zeros(size(im));

    %// For each pixel in our image, ignoring the borders...
    for row = 2 : rows - 1
        for col = 2 : cols - 1
            cen = im(row,col); %// Get centre

            %// Get neighbourhood - cast to double for better precision
            pixels = double(im(row-1:row+1,col-1:col+1));

            %// Get ranges and determine LTP
            out_LTP = zeros(3, 3);
            low = cen - t;
            high = cen + t;
            out_LTP(pixels < low) = -1;
            out_LTP(pixels > high) = 1;
            out_LTP(pixels >= low & pixels <= high) = 0;

            %// Get upper and lower patterns
            upper = out_LTP;
            upper(upper == -1) = 0;
            upper = upper(reorder_vector);

            lower = out_LTP;
            lower(lower == 1) = 0;
            lower(lower == -1) = 1;
            lower = lower(reorder_vector);

            %// Convert to a binary character string, then use bin2dec
            %// to get the decimal representation
            upper_bitstring = char(48 + upper);
            ltp_upper(row,col) = bin2dec(upper_bitstring);

            lower_bitstring = char(48 + lower);
            ltp_lower(row,col) = bin2dec(lower_bitstring);
       end
   end

让我们慢慢浏览一下这段代码。首先,我得到图像的尺寸,以便我可以迭代每个像素。另外,请记住,我假设图像是灰度。一旦我这样做,我分配空间来存储我们图像中每个像素的上下LTP模式,因为我们需要将其输出给用户。我已经决定忽略边界像素,当我们考虑一个像素邻域时,如果窗口超出界限,我们会忽略这些位置。

现在,对于图像有效边框内的每个有效像素,我们提取像素邻域。我将这些转换为双精度以允许负差异,以及更好的精度。然后,我计算低和高范围,然后根据我们上面讨论的指南创建LTP模式。

一旦我计算了LTP模式,我就创建了两个版本的LTP模式upperlower,其中上部模式的任何值-1都映射到0,下部模式的值为1 。此外,对于较低的模式,原始窗口中任何1的值都映射为0.之后,我按照我布局的顺序提取出位 - 从东边开始,逆时针方向。这是reorder_vector的目的,因为这将允许我们提取这些确切的位置。这些位置现在将成为一维矢量。

这个1D向量很重要,因为我们现在需要将此向量转换为字符串,以便我们可以使用bin2dec将值转换为十进制数。上部和下部LTP的这些数字是最终用于输出的数字,我们将它们放在两个输出变量的相应位置。


此代码未经测试,因此,如果它不符合您的规格,则由您自行调试。

祝你好运!