当前位置: 首页 > 知识库问答 >
问题:

矩阵计算

宗政德宇
2023-03-14

我有一个384*512*3RGB矩阵。只有512唯一的颜色以不同的权重重复它们自己。从它们中,我得选择一半,另一半必须用从第一个中最接近的元素替换。

我想到了在图像中循环,并搜索最近的颜色为当前的一个。找到后,我把一个换成另一个。

但我有3个循环1:3841:5121:256。前两个I循环通过RGB矩阵,第三个用于循环到包含最终颜色的矩阵。这需要一些时间来计算。

可以做些什么来加快它的速度?

循环如下所示:

dim=size(RGB);
for i=1:dim(1)
    for j=1:dim(2)
        aux=[RGB(i,j,1) RGB(i,j,2) RGB(i,j,3)];
        minim=RGB_dist(uint8(V_colors_K(1,1:3)),aux);
        index=1;
            for k=1:K
            %index=1;
            if (minim>RGB_dist(uint8(V_colors_K(k,1:3)),aux))
                minim=RGB_dist(uint8(V_colors_K(k,1:3)),aux);
                index=k

            end
            RGB(i,j,1)=V_colors_K(index,1);
            RGB(i,j,2)=V_colors_K(index,2);
            RGB(i,j,3)=V_colors_K(index,3);
        end
    end
end

v_colors_k表示选择为最终颜色的半色。

我可以考虑一些小的改进。如果颜色在good的一半中,则不需要最小距离。

以下是更精确的算法:

定义1。函数D(c1,c2)是两个颜色向量c1和c2之间的距离,如欧氏距离。

定义2。函数P(c)是颜色c的像素数。定义3.Base-color初始颜色集Q的cbase是满足以下等式的颜色

定义4.颜色c的加权乘积V(c)定义为

其中wp是像素数的权重,wd是颜色距离的权重。

给定第一个颜色cbase,我们的方法计算其他颜色的加权乘积,选择第一个K-1个最大的乘积。与基色对应的K-1色被用于形成初始调色板。左侧的N-K颜色与初始调色板中最接近的颜色合并,以产生最终的调色板。

RGB_dist函数:

function[distance]=RGB_dist(x,y)

    distance=sqrt(sum((double(x-y)).^2*[3;4;2],2));

end

我有一个函数,它对整个矩阵起作用,它计算所有对之间的距离。

function[D]=RGB_dist_full_2(x)

I = nchoosek(1:size(x,1),2);

D = squareform(RGB_dist(x(I(:,1),:), x(I(:,2),:)))

end

然后,我需要得到每个列的最小值。

共有1个答案

程赞
2023-03-14

如果我正确地理解了这一点,您将操作rgb_dist()两两应用于v_colors_k中的每个颜色和rbg中的每个像素。如果rgb_dist()是一个线性函数,就像一个点积,那么您可以将它一次应用于整个矩阵。例如,如果它是一个点积,那么您可以将整个内部循环替换为:

DISTS = V_colors_K * RGB(i,j,:)';
k = find( DISTS == min(DISTS(:)) );
RGB(i,j,:) = V_colors_K(k,:);

如果不知道rbg_dist()中的内容,我无法给出更好的答案。我能给出的一般答案是:Matlab的循环很慢,如果你想让它运行得更快,你需要去掉所有的循环,只使用矩阵运算(这是轻快的)。用矩阵ops替换循环的过程称为向量化代码,它可能很棘手。如果不知道您在rbg_dist()中做了什么,就不可能为您提供一个完整的矢量化。

我在matlab中通常的工作流程是用循环来编写一些直观的东西,就像你所做的那样,然后一旦它给我正确的结果,我就回去想办法把它矢量化(即用矩阵运算替换所有的循环),以使它更快。矢量化是很棘手的,它就像一个线性代数难题,而且速度的提高总是要比编写代码要花很多时间。

更新:

我得到的最好的是在你的基础颜色上使用一个循环。您与RGB_dist函数非常接近,因为这一行在整个矩阵上都能很好地工作:

[RGBwidth RGBHeight RGBdepth] = size(RGB);
minDists=inf( [RGBwidth RGBheight] );
bestKs=zeros( [RGBwidth RGBheight] );
for k=1:K
    % make matrix out of the color k, the same shape as RGB
    color_K_mat = premute(repmat(V_colors_K(k,:), [RGBwidth 1 RGBheight]), [3 1 2]);

    % compute the distance from each pixel's color to color k
    dists = sqrt(sum((RGB-color_K_mat).^2, 3));

    % create a binary mask showing which pixels are closer to this color than to any previous one
    mask = (dists < minDists);

    % update your results matrices
    bestKs = not(mask)*bestKs + mask*k
    minDists = min(bestKs, dists);
end

% now bestKs(i,j) gives you the index k of the closest color for pixel (i,j)
% and minDists(i,j) gives you the distance to that color

从理论上讲,即使是这个循环也可以向量化,但这是一个更大的难题,我有自己的工作要做:p

 类似资料:
  • 问题内容: 我正在尝试计算Java中的逆矩阵。 我遵循伴随方法(首先计算伴随矩阵,然后转置该矩阵,最后将其乘以行列式值的倒数)。 当矩阵不太大时有效。我检查过,对于尺寸最大为12x12的矩阵,可以快速提供结果。但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长。 我需要反转的矩阵是19x19,并且花费太多时间。消耗更多时间的方法是用于行列式计算的方法。 我使用的代码是: 有人知道如何更有效

  • 如上所述,我需要用Python找到矩阵的基-2-对数。当然,我知道公式$log_a(x)=ln(x)/ln(a)$,其中ln是自然对数,但据我所知,这只适用于标量参数x(如果我错了请纠正我)。至少我还没有看到任何论据,为什么这也适用于矩阵。 那么,有人知道是否存在这样一个内置在matrix-log2函数吗? 或者:由于几年前我使用过Mathematica,所以我知道了MatrixFunction[

  • 问题内容: 我想通过Tensorflow计算Jacobian矩阵。 是)我有的: 是损失函数,都是可训练的变量,并且是许多数据。 但是,如果我们增加数据数量,则需要花费大量时间来运行该功能。有任何想法吗? 问题答案: 假设和是Tensorflow张量,并且取决于: 结果具有形状,并提供的每个元素相对于的每个元素的偏导数。

  • 着色器语言中通过关键字mat2、mat3、mat4分别声明一个2x2矩阵、3x3矩阵、4x4矩阵,通过内置函数mat2()、mat3()、mat4()分别创建一个2x2矩阵、3x3矩阵、4x4矩阵。 关键字 数据类型 mat2 2x2矩阵,4个元素 mat3 3x3矩阵,9个元素 mat4 4x4矩阵,16个元素 声明变量 关键子mat4声明一个4x4矩阵 mat4 matrix4; 构造函数赋

  • 问题内容: 我想使用scipy计算矩阵的数学等级。最明显的函数是计算数组的维数(即标量的维数为0,矢量为1,矩阵为2等)。我知道该模块具有此功能,但是我想知道这样的基本操作是否内置在某个矩阵类中。 这是一个明确的示例: 这给出了维度,我正在寻找的答案。 问题答案: Numpy提供:

  • 我在查看一些代码时发现了以下内容: 有什么区别呢?顺便说一句:我对矩阵很陌生