我想在图像结果中读取pixcels的值,以便将此值与某些值进行比较 我用来循环
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
但是效果太慢了,你能帮助我,我可以用什么而不是循环? 非常感谢
答案 0 :(得分: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
。我不是想调试那个;只是让你快速实现你的内循环。
答案 1 :(得分:0)
您的图像似乎是灰色或单色,因为Temp=pixel(i,j)
提供的数字不是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
答案 2 :(得分: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)
i
在屏幕上打印。移除它们或通过;
结束它们。
3.您可以在最后一行使用temp(:)
,因为temp
是一维的
4.不同的功能适用于不同类型的变量。在此代码中,您可以使用sqrt()
代替sqrtm()
。它可能会稍快一点
5。这段代码中的一个大问题是在你的最后一次比较中,如果temp
矩阵的非元素与result
特定元素不相等,那么就做一些事情!除非知道代码的真正目的,否则很难改进这部分!您可能会在其他具有完全不同代码的算法中解决问题。但如果没有办法,那么以这种方式使用它(嵌套循环)祝你好运!