找到不同广场标志的最快方法

时间:2015-03-01 15:27:27

标签: performance matlab image-processing optimization matrix

给定图像I和两个矩阵m_1; m_2(与I相同的大小)。函数f定义为: enter image description here 因为我的目标设计想得到f的标志。因此,函数f可以重写如下: enter image description here

  • 我认为第二个公式比第一个公式快,因为:它 可以忽略平方词
  • 它可以直接计算符号,而不是第一个等式中的两个步骤:计算f并检查符号。

你同意我的意见吗?你有另一个更快的公式f

I =[16    23    11    42    10
    11    21    22    24    30
    16    22   154   155   156
    25    28   145   151   156
    11    38   147   144   153];

m1 =[0     0     0     0     0
     0     0    22    11     0
     0    23    34    56     0
     0    56     0     0     0
     0    11     0     0     0];

m2 =[0     0     0     0     0
     0     0    12    11     0
     0    22   111   156     0
     0    32     0     0     0
     0    12     0     0     0];

输出f是

 f =[1     1     1     1     1
     1     1    -1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1]

我实现了第一种方式,但我没有通过matlab完成第二种方式。你可以检查第二种方式帮助我并进行比较

更新:我想添加chepyle和Divakar的代码以明确提问。请注意,它们都提供与上面f

相同的结果
function compare()
I =[16    23    11    42    10
    11    21    22    24    30
    16    22   154   155   156
    25    28   145   151   156
    11    38   147   144   153];

m1 =[0     0     0     0     0
    0     0    22    11     0
    0    23    34    56     0
    0    56     0     0     0
    0    11     0     0     0];

m2 =[0     0     0     0     0
    0     0    12    11     0
    0    22   111   156     0
    0    32     0     0     0
    0    12     0     0     0];

    function f=first_way()
        f=sign((I-m1).^2-(I-m2).^2);
        f(f==0)=1;

    end

    function f= second_way()
        f = double(abs(I-m1) >= abs(I-m2));
        f(f==0) = -1;

    end

    function f= third_way()
        v1=abs(I-m1);
        v2=abs(I-m2);
        f= int8(v1>v2) + -1*int8(v1<v2); % need to convert to int from logical
        f(f==0) = 1;

    end

disp(['First way : '  num2str(timeit(@first_way))])
disp(['Second way: '  num2str(timeit(@second_way))])
disp(['Third way : '  num2str(timeit(@third_way))])

end

First way : 1.2897e-05 Second way: 1.9381e-05 Third way : 2.0077e-05

2 个答案:

答案 0 :(得分:3)

第二个公式的准确性存在问题,但是为了比较,这里我将如何在matlab中实现它,以及避免平方和sign()函数的第三种方法,符合你的意图。请注意,matlab的矩阵和符号函数已经过很好的优化,第二种和第三种方法都很慢。

function compare()
I =[16    23    11    42    10
    11    21    22    24    30
    16    22   154   155   156
    25    28   145   151   156
    11    38   147   144   153];

m1 =[0     0     0     0     0
    0     0    22    11     0
    0    23    34    56     0
    0    56     0     0     0
    0    11     0     0     0];

m2 =[0     0     0     0     0
    0     0    12    11     0
    0    22   111   156     0
    0    32     0     0     0
    0    12     0     0     0];

    function f=first_way()
        f=sign((I-m1).^2-(I-m2).^2);
    end

    function f= second_way()
        v1=(I-m1);
        v2=(I-m2);
        f= int8(v1<=0 & v2>0) + -1* int8(v1>0 & v2<=0);
    end

    function f= third_way()
        v1=abs(I-m1);
        v2=abs(I-m2);
        f= int8(v1>v2) + -1*int8(v1<v2); % need to convert to int from logical
    end

disp(['First way : '  num2str(timeit(@first_way))])
disp(['Second way: '  num2str(timeit(@second_way))])
disp(['Third way : '  num2str(timeit(@third_way))])

end

输出:

First way : 9.4226e-06
Second way: 1.2247e-05
Third way : 1.1546e-05

答案 1 :(得分:3)

这似乎具有可比性,有时可能比原始方法快一点 -

f = sign(abs(I-m1) - abs(I-m2)) + sign(abs(m1-m2)) + ...
    sign(abs(2*I-m1-m2)) - 1 -sign(abs(2*I-m1-m2) + abs(m1-m2))

基准代码

%// Create random inputs
N = 5000;
I = randi(1000,N,N);
m1 = randi(1000,N,N);
m2 = randi(1000,N,N);

num_iter = 20;  %// Number of iterations for all approaches

%// Warm up tic/toc.
for k = 1:100000
    tic(); elapsed = toc();
end

disp('------------------------- With Original Approach')
tic
for iter = 1:num_iter
    out1 = sign((I-m1).^2-(I-m2).^2);
    out1(out1==0)=-1;
end
toc, clear out1

disp('------------------------- With Proposed Approach')
tic
for iter = 1:num_iter    
    out2 = sign(abs(I-m1) - abs(I-m2)) + sign(abs(m1-m2)) + ...
           sign(abs(2*I-m1-m2)) - 1 -sign(abs(2*I-m1-m2) + abs(m1-m2));    
end
toc

<强>结果

------------------------- With Original Approach
Elapsed time is 1.751966 seconds.
------------------------- With Proposed Approach
Elapsed time is 1.681263 seconds.