在Matlab中移植SVG合成标准的问题

时间:2019-06-04 14:22:53

标签: matlab image-processing compositing

我已经在Matlab中移植了SVG合成标准(2009,https://www.w3.org/TR/2009/WD-SVGCompositing-20090430/)的24种方法中的大多数,但是四种方法(如减淡色)在比较if语句(例如:if Sca)中的图像时进行了中继== Sa && Dca == 0 ...),但是Matlab将此视为非标量运算符。

Sc,Dc是RGB图像 Sa,Da是代表Alpha通道的灰色蒙版 Dca,Sca是预乘的图像: Dca = Dc。* Da; Sca = Sc。* Sa;

if strcmp(compo_meth, 'color-dodge') == 1; 
    if Sca == Sa && Dca == 0
        Dca = (1 - Da) .* Sca;
    elseif Sca == Sa
        Dca = Sa .* Da + (1 - Da) .* Sca + (1 - Sa) .* Dca;
    elseif Sca < Sa
        Dca = Sa .* Da .* min(1, Dca/Da .* Sa/(Sa - Sca));
    end
    Da  = Sa + Da - Sa .* Da;
end

错误 如果Sca == Sa && Dca == 0

||的运算符和&&运算符必须可转换为逻辑标量值

1 个答案:

答案 0 :(得分:0)

一个freelancer.com项目提供了以下建议,该建议比arrayfun版本快大约10倍以上,但如果Matlab像其他大多数其他方式一样可以直接使用SVG标准中的语法,则比预期慢5倍以上情况:

if strcmp(compo_meth, 'color-dodge') == 1
    rc = (Sca == Sa) & (Dca == 0);
    Dca(rc) = (1 - Da(rc)) .* Sca(rc);
    rc1 = (Sca == Sa) & (Dca ~= 0);
    Dca(rc1) = Sa(rc1) .* Da(rc1) + (1 - Da(rc1)) .* Sca(rc1) + (1 - Sa(rc1)) .* Dca(rc1);
    rc2 = (Sca < Sa);
    Dca(rc2) = Sa(rc2) .* Da(rc2) .* min(1, Dca(rc2)./Da(rc2) .* Sa(rc2)./(Sa(rc2) - Sca(rc2)));
    Da = Sa + Da - Sa .* Da;
end