0

我已经在 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 时出现错误

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

4

1 回答 1

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
于 2019-09-28T10:42:49.610 回答