如何在MATLAB中计算像素变化率

3
有两个公式我在MATLAB中很难表示。假设有两个相同大小的RGB图像AB,其中mn表示行和列,第三维d=3。Formula1基本上计算像素的变化率,如果A是原始图像,B是扭曲版本。Formula2计算像素的平均变化率。 1. Formula1= { sum(C(m,n,d)) / (m * n)} * 100
  where `C(m,n) = 0`, if `A(m,n) = B(m,n)`
                `=1`, if `A(m,n) != B(m,n)`

对所有行和列进行求和,包括第三维。

我尝试了类似于这样的方法:

Formula1 = sum(sum(abs(double(A)-double(B))./(m*n), 1), 2);

但是这不会产生任何错误。然而,这不是正确的表示方法,因为if条件没有被纳入。问题在于如何通过检查A == B或A != B来结合条件。
2. 公式2为{ 1/ (m*n)} * sum { norm (A - B) / 255} * 100。同样,在所有维度上进行求和。我不知道如何形成矩阵的范数。
3. 公式3为{ 1/ (m*n)} * sum {(A - B) / 255} * 100。我尝试了以下方法:

C = double(sum(A-B,3)); r = reshape(100*(C/255)/(m*n),[1 3])

但出现了一个错误,说维度应该相同,而且reshape无法工作。
2个回答

5

对于Formula1

function r = Formula1(A,B)
[m,n,d] = size(A); %# A and B must have the same dimension
C = A ~= B; %# C has a 1 in every pixel that's different
r = double(sum(C(:)))/(m*n);
r = r/d; %# normalize by number of color planes
~= 运算符用于检查不等式。 (:) 向量化矩阵,使我们能够在所有维度上计算总和。
对于 Formula2:
function r = Formula2(A,B)
[m,n,d] = size(A);
C = double(sum(A-B, 3)); %# sum over the color planes
C = C/d; %# normalize by number of color planes
K = norm(C); %# or norm(C,1), norm(C,inf) etc.
r = 100*(K/255)/(m*n);

在这里,sum(A-B, 3)对颜色平面求和,得到一个与原始图像相同维度的二维矩阵。有几种矩阵范数可供选择,在NORM文档中可以找到。


1
Matlab每个m文件只允许一个函数定义。因此,要么(a)将它们放在自己的m文件中,并从主脚本或提示符中调用它们,要么(b)删除r = Formula...这一行,并将它们直接复制到您的脚本或提示符中。对于您的第二个问题,是的,结果将在r中。有关函数文件的详细信息,请参见http://www.mathworks.com/help/techdoc/ref/function.html。 - mtrw
如果您正在分析RGB图像,则有三个颜色平面。 如果A和B完全不同,则sum(C(:))将为3mn,而不是m*n。 您有两个选择:您可以除以颜色平面的数量,或者在求和之前使用any(C,3)生成一个新矩阵,其中逻辑1指示至少一个颜色平面中存在差异的像素。请参阅any的文档:http://www.mathworks.com/help/techdoc/ref/any.html - mtrw
如果您能更新您的答案,那将非常有帮助。确实会有三个这样的值,每个颜色平面一个。 - SKM
1
我认为独立获取每个颜色平面的结果最简单的方法是执行squeeze(sum(sum(C)))。最内层的求和操作跨越列以生成一个(1,n,d)矩阵,接下来的求和操作跨越生成的行以生成一个(1,1,d)矩阵,而squeeze则消除了前导单例维度。请参见http://www.mathworks.com/help/techdoc/ref/squeeze.html。 - mtrw
(2) 答案完全相同 (3) r = zeros(1,d) 只计算一次,用于所有三个波段,For循环也是如此。请问您能否详细说明如何分别计算 r(k) = norm(C(:,:,d)) 并对其他两个分量执行 red =(100*(r(k)/255))/(m*n)。 - SKM
显示剩余20条评论

0

(A ~= B) 会生成一个逻辑数组,其中元素不同的地方等于 true。你可以将其转换为例如 double,这样它就会在元素不同时等于 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接