gpt4 book ai didi

matlab - Mat循环的for循环矢量处理RGB图像中的像素

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:05 24 4
gpt4 key购买 nike

我还在学习matlab,我正在尝试理解矢量化我认为问题的根源在于我不知道如何引用不同的矩阵等等我希望这个问题的答案能帮助我理解。

FI = imread(ForegroundImageName);
BI = imread(BackgroundImageName);
refRows =size(FI,1);
refCols =size(FI,2);
refChan =size(FI,3);
CommonRGB = mode(mode(FI));
BI = imresize(BI, [refRows refCols]);
swappedPixels = 0;

for row=1:refRows
for col=1:refCols
if(FI(row,col,:)==CommonRGB)
FI(row,col,:)=BI(row,col,:);
swappedPixels = swappedPixels + 1;
end
end
end

这个问题的背景是,如果前景像素与最常见的颜色匹配,我将用背景像素替换前景像素CommonRGB是一个1x1x3矩阵,正如 mode(mode(FI))所示图像是三维彩色RGB图像我选择这个作为我问题的一个简单例子这个for循环执行我希望它执行的操作,并且似乎有效只是需要很长时间才能完成for循环我执行 mode(mode(FI))只是运行上述for循环所需时间的一小部分,我试图自己实现 mode(mode(FI)),与上面的像素交换相比,它变得相当复杂我在创建直方图时也遇到了类似的问题我希望你能帮助我学习更多关于matlab的知识,并将我的编程知识扩展到这门语言中我知道如果我说我想对整个矩阵执行这些操作,那么如果我们对它进行向量化,我会假设在这个例子中不需要 refRowsrefColsrefChan变量。
我的一次失败尝试
if(FI(:,:,:)==CommonRGB)
FI(:,:,:)=BI(:,:,:);
swappedPixels = swappedPixels + 1;
end

从目前的答案来看,他们已经展示了将逻辑矢量化的方法我得到的结论是,任何其他不涉及long-for循环的方法都比像我这样使用large-for循环要快得多即使这意味着创建额外的数组并执行额外的过程,比如创建一个掩码数组并在图片上运行多次根据我的判断和猜测,问题的根源在于,matlab的JIT实时编译器必须在for循环的每次迭代中重新分析命令这种对for循环的解析和处理是速度问题的真正根源如果matlab能够“看到”for循环并提前计划,那么它将运行得更快因此,我无法对原始代码做任何事情,我只能用其他东西替换row和col,并删除这两个for循环我将不得不设计其他不使用大for循环的方法只有这样它才能以合理的速度运行这告诉我,matlab是一种真正的前端脚本语言,因为使用for循环运行脚本同样会导致性能下降因此,我不确定如何将这个问题标记为已回答、未回答或投票决定其他答案因为如果我改变for循环中的逻辑,那么我必须改变如何实现加速。
所以,除非有人能告诉我如何用 1:refRows之类的东西替换for循环中的变量行和列,使用parfor,使用一些简单的东西,只改变for循环中的代码并删除for循环,或者只写一个答案来验证上面的段落,否则我不知道现在该怎么做。
正如@Divakar所说,“你是对的,这里没有一个明确的矢量化技术,只插入循环参数,并有一个矢量化的解决方案如果你有一个单一的循环,而不是这两个嵌套循环的情况下,你可以得到一个更直接的插件N-播放矢量化解决方案,使用逻辑索引。但是,矢量化在大多数情况下是不能推广的,需要根据具体情况来处理祝你在矢量化探索中好运–迪瓦卡“
也就是说,我想通过向其他人展示我所做的来应用我从这个问题中学到的东西来帮助他们我想,我似乎已经找到了算法,虽然我仍然不确定我的第三阶段使用光阈值选择共同色调是否有效我看不出当光阈值上升时它会选择不同的色调我只看到第三阶段总是选择不同于第二阶段的色调直到今天我才意识到这一点对问题本身并不重要,但下面对问题很重要,因为我提到了for循环方法,然后实现了一个矢量化方法在第2-3阶段比第1阶段更容易,在第一阶段我不需要改变太多…它没有让我粘贴那么多信息,所以我会尝试另一种方法。
My PDF of my lab report with code and pictures
我知道模式(模式(FI))是不正确的,但我仍然好奇第二阶段是如何得到不同于第三阶段的色调的我认为第二阶段是正确的,我一次逐像素比较,以验证第二阶段与第三阶段相同,但模式(FI(:)应该是正确的如果你看到任何问题,请告诉我我理解大多数矢量化,除了如何使用掩码作为索引我知道他们称之为逻辑索引,但我想只有1意味着它会使用它,而0意味着它不会看到那个值。

最佳答案

矢量化有两个非常重要的工具-bsxfunlogical indexing现在,bsxfun确实可以使用逻辑运算符,因此只要使用这两个函数,就可以实现大多数矢量化代码。
图像处理中的bsxfunlogical indexing
如何以及何时使用logical indexing
在某些情况下,当使用RGB图像时,特别是当需要索引到两个维度时(如这里的情况),它可能会变得棘手,因为不能直接使用逻辑索引。
在这样的情况下,可以使用的一个技巧是使用reshape,提供其余维度所需的索引是统一结构的,这在这个问题案例中再次得到满足。
如何以及何时使用bsxfun
bsxfun在各种问题中找到最优解对于给定的问题,我们可以将其用于以矢量化方式进行的许多等式比较检查。
这是通过将CommonRGB重塑成一个大小来实现的,这样就有一个单独的维度对应于重塑rowcolFI的组合维度bsxfun然后处理整形后的"expansion"所需的CommonRGB并使用内置的函数句柄@eq执行相等性检查。
让我们跳到使用前面讨论的这两个函数和技术的矢量化代码-

%// Reshape the inputs and save as new variables
FIr = reshape(FI,[],3);
BIr = reshape(BI,[],3);
CommonRGBr = reshape(CommonRGB,[],3);

%// Create 1D equality mask corresponding the equality satisfied across
%// two dimensions - `row` and `col`
mask = all(bsxfun(@eq,FIr,CommonRGBr),2);
swappedPixels = sum(mask); %// Get the count of "swappings"

%// Perform the "swaps" and then reshape FI back to its original size
FIr(mask,:) = BIr(mask,:);
FI = reshape(FIr,size(FI));

标杆管理
本节将讨论所建议的矢量化代码与原始代码之间的基准测试首先,我们创建了
原始码和矢量码的函数形式。
(1)原代码-
function [FI,swappedPixels] = org_code(FI,BI,CommonRGB)

refRows =size(FI,1);
refCols =size(FI,2);

swappedPixels = 0;
for row=1:refRows
for col=1:refCols
if(FI(row,col,:)==CommonRGB)
FI(row,col,:)=BI(row,col,:);
swappedPixels = swappedPixels + 1;
end
end
end

return;

(2)矢量化代码-
function [FI,swappedPixels] = vectorized_code(FI,BI,CommonRGB)

FIr = reshape(FI,[],3);
BIr = reshape(BI,[],3);
CommonRGBr = reshape(CommonRGB,[],3);

mask = all(bsxfun(@eq,FIr,CommonRGBr),2);
swappedPixels = sum(mask);

FIr(mask,:) = BIr(mask,:);
FI = reshape(FIr,size(FI));

return;

(3)最后,这里是基准代码,它还绘制了加速-
N_arr = [100 200 500 1000 2000 4000]; %// datasize array
timeall = zeros(2,numel(N_arr));
for iter = 1:numel(N_arr)
N = N_arr(iter);
FI = uint8(randi(255,N,N,3));
BI = uint8(randi(255,N,N,3));

CommonRGB = mode(mode(FI));
BI = imresize(BI, [size(FI,1) size(FI,2)]);

f = @() org_code(FI,BI,CommonRGB);
timeall(1,iter) = timeit(f);
clear f

f = @() vectorized_code(FI,BI,CommonRGB);
timeall(2,iter) = timeit(f);
clear f
end
figure,hold on,grid on
plot(N_arr,timeall(1,:)./timeall(2,:),'-bo')
legend('Speedup with Vectorized Code over Original one'),
xlabel('Datasize ->'),ylabel('Speedup Factor (x)')

在我的系统上得到的绘图结果是这样的-
结论
这表明,使用所提出的矢量化解决方案可以大大加快速度希望这能在一定程度上吸引你进入矢量化领域,尤其是 170x
系统配置
MATLAB Version: 8.3.0.532 (R2014a)
Operating System: Windows 7
RAM: 3GB
CPU Model: Intel® Pentium® Processor E5400 (2M Cache, 2.70 GHz)

关于matlab - Mat循环的for循环矢量处理RGB图像中的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27407712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com