-9

我想读取图像结果中像素的值,以将此值与我用于 for 循环的一些值进行比较

function GrdImg= GrdLbp(VarImg,mapping,LbpImg)
tic
p=mapping.samples;
[Ysize,Xsize]=size(result);
GImg=zeros(Ysize,Xsize);
temp=[];
cnt=1;
for n=0:p-1
    temp(cnt)=2^n;
    temp(cnt+1)=(2^p)-1-(2^n);
    cnt=cnt+2;
end
for i=1:Ysize
    i
        for j=1:Xsize
                if isempty(find(result(i,j)==temp(:,:)))==1
                  GImg(i,j)=sqrtm(Vresult(i,j));
                end


            end
        end 

但它工作得太慢了,你能帮我用什么代替for循环吗?非常感谢

4

3 回答 3

6

您并没有真正提供足够的信息来回答您的问题 - 因为,正如评论中所述,您现在没有对循环中的值做任何事情。所以让我给你一些想法:

1) 将所有像素与一个固定值进行比较,并返回大于最大值 90% 的所有像素的索引:

threshold = 0.9 * max(myImage(:));
prettyBigPixels = find(myImage > threshold);

2) 将所有小于最大值的 5% 的像素设置为零:

threshold = 0.05 * max(myImage(:));
myImage(myImage < threshold) = 0;

在第一种情况下,该find命令返回所有索引(注意 - 您可以使用从 1 到 M*N 的单个索引访问 MxN 的 2D 矩阵)。如果需要,您可以使用它ind2sub来转换为各个i, j系数。

在第二种情况下,将(myImage < threshold)矩阵作为索引称为逻辑索引- 它非常快,并且只会访问那些符合标准的元素。

如果您让我们知道您对发现的值的实际操作,我们可以加快速度;因为现在,您的代码的最终结果是,当循环完成时,您的值Temp等于最后一个元素 - 由于您在循环中没有做任何事情,我们可以将整个事情重写为

Temp = pixel(end);

编辑现在您展示了您在内部循环中所做的事情,我们可以进行更多优化。Behzad 已经展示了如何加快向量的计算速度temp- 无需添加任何内容,这是正确的方法。至于两个嵌套循环,可能是花费最多时间的地方,你可以用一行找到你感兴趣的所有像素:

pixelsOfInterest = find(~ismember(result(:), temp(:)));

这将找到在result中没有出现的像素索引temp。然后你可以做

GImg(pixelsOfInterest) = sqrt(result(pixelsOfInterest));

这两行代码应该一起替换代码中所有内容的for i=1:Ysize功能end。注意 - 您的变量似乎未初始化,并更改名称 - 有时是result,有时是Vresult. 我不想调试它;只是给你一个快速实现你的内部循环。

于 2013-07-22T14:27:57.817 回答
0

顺便说一句,对于完全编辑的问题,我回答新的而不是编辑我以前的答案。

您可以通过某些方式改进您的代码:
1. 而不是:

    for n=0:p-1
        temp(cnt)=2^n;
        temp(cnt+1)=(2^p)-1-(2^n);
        cnt=cnt+2;
    end
    
使用这个:
    temp=zeros(1,2*p);
    n=0:p-1;
    temp(1:2:2*p)=2.^n; %//for odd elements 
    temp(2:2:2*p)=2^p-1-2.^n; %//for even elements (i supposed p>1) 

2.当代码准备好计算而不是调试或其他时间时,永远不要在屏幕上打印一些变量,因为它运行时间太长(以 cpu 周期计)。在您的代码中,有一些变量i会打印在屏幕上。删除它们或结束它们;


3.您可以temp(:)在最后一行使用,因为temp它是一维的
4.不同的函数用于不同类型的变量。在此代码中,您可以使用sqrt()而不是sqrtm(). 它可能会稍微快一点。

5.这段代码中的大问题是在你最后的比较中,如果temp矩阵的非元素不等于result特定元素,那就做点什么吧!除非知道代码的真正目的,否则很难改进这部分!您可能会在其他具有完全不同代码的算法中解决问题。但是如果没有办法,就这样用(嵌套循环)
祝你好运!

于 2013-07-23T22:49:40.590 回答
0

看来您的图像是 grayscle 或 monocolor ,因为顺便Temp=pixel(i,j)给出了一个数字而不是 3 数字。

你的问题没有更多的解释,所以我认为你要比较的三种数字。

  1. 与一个常数比较
  2. 与一系列数字进行比较
  3. 与二维数字矩阵进行比较

如果您需要第一个或第三个,解决方案非常简单(绝对在第三个中,矩阵的大小必须等于pixel大小)

  • 与数字比较(c是数字或二维数组)

    comp=pixel - c;
    

    但是,如果您需要第二个,您可以先重塑pixel为一维矩阵,然后将其与数字系列进行比较(该系列的s绝对长度必须等于pixel行数和列数的乘积;您可以在之后重新整形pixel矩阵与初级二维矩阵的比较。

  • 与数字系列的比较s

    pixel_temp = reshape(pixel,1,[]);
    comp = pixel_temp - s;
    pixel_compared = reshape(pixel_temp,size(pixel,1),size(pixel,2));  % to re-reshape to primary size
    
于 2013-07-22T16:08:12.603 回答