我正在计算图像的局部三元模式。我的代码如下。我是否朝着正确的方向前进?
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应用的图像。
答案 0 :(得分:2)
这不是很正确。这是LTP的示例,给出了3 x 3图像补丁和阈值t
:
将窗口中的像素指定为0的范围是阈值介于c - t
和c + 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模式upper
和lower
,其中上部模式的任何值-1都映射到0,下部模式的值为1 。此外,对于较低的模式,原始窗口中任何1的值都映射为0.之后,我按照我布局的顺序提取出位 - 从东边开始,逆时针方向。这是reorder_vector
的目的,因为这将允许我们提取这些确切的位置。这些位置现在将成为一维矢量。
这个1D向量很重要,因为我们现在需要将此向量转换为字符串,以便我们可以使用bin2dec
将值转换为十进制数。上部和下部LTP的这些数字是最终用于输出的数字,我们将它们放在两个输出变量的相应位置。
此代码未经测试,因此,如果它不符合您的规格,则由您自行调试。
祝你好运!