有一个固定大小为256 * 256 * 3(RGB)的图像A
。众所周知,图像中两个相邻像素值x,y
之间协方差的数学公式为:
cov(x,y) = 1/n summation from i = 1 to n of [E(x_i-E(x))(y_i-E(y))]
r_xy = cov(x,y) / (sqrt(D(x)*D(y)))
D(x) = 1/n summation from i = 1 to n of square[(x_i - E(x))]
E(x) = 1/n summation from i = 1 to n of (x_i)
其中r_xy
是这两幅图像的两个水平,垂直和对角相邻像素之间的相关系数。
Q1:如何在MATLAB中进行上述计算?
Q2:如何从图像中随机选择5000对两个水平相邻像素,然后绘制这两个水平相邻像素的分布?
答案 0 :(得分:3)
与truecolor RGB images的图像处理一样,首先要解决几个关键问题。我在my answer到your other question中提到了涉及不同图像处理算法的这些,但是它们在这里重复:
好的,既然这些手续已经完成,我认为上面的问题包含两个步骤。首先,您必须从图像中选择成对像素的子集,例如所有水平配对像素。其次,您必须应用上面的统计公式。在下面的例子中,我假设操作是在矩阵A
的红色(即第一个)颜色平面上执行的:
选择配对像素的子集:让我们从一组独特的水平像素配对开始。如果我选择A
第一列中的像素并将它们放在子集x
中,那么水平相邻的像素将是A
第二列中的像素,这些像素将是放在子集y
中。我还可以将第二列中的像素添加到子集x
,然后将第三列中的水平相邻像素放置在子集y
中。对A
中的所有列重复此操作,我们可以看到第1列到第255列中的像素将位于子集x
中,第2列到第256列中的像素将位于子集{{1}中}。 double precision因此如下所示:
y
遵循上述类似的逻辑,您可以这种方式构建整个独特的垂直像素对:
x = A(:,1:end-1,1); %# All rows and columns 1 through 255 from red plane
y = A(:,2:end,1); %# All rows and columns 2 through 256 from red plane
同样对于一组独特的对角线像素配对,其中“对角线”在矩阵中从左上角到右下角:
x = A(1:end-1,:,1); %# Rows 1 through 255 and all columns from red plane
y = A(2:end,:,1); %# Rows 2 through 256 and all columns from red plane
或者对于“反对角线”,其中“对角线”在矩阵中从左下角到右上角运行:
x = A(1:end-1,1:end-1,1); %# All but the last row and column
y = A(2:end,2:end,1); %# All but the first row and column
现在,您可以选择这些x = A(2:end,1:end-1,1); %# All but the first row and last column
y = A(1:end-1,2:end,1); %# All but the last row and first column
和x
数据集中的任何一个来执行红色平面所需的统计计算。您可以重复上述步骤,用2或3代替每行中的最后一个索引,分别得到绿色和蓝色平面的计算。
执行统计测试:这部分很简单。已经有一个内置函数matrix indexing用于计算MATLAB中的相关系数。您可能必须首先使用CORRCOEF将像素值y
和x
的子集重新整形为列向量:
y
其他公式也存在这样的函数:r_xy = corrcoef(x(:),y(:));
为single-colon indexing,E(x)
为MEAN,D(x)
为VAR。
关于你的第二个问题,你可以像我上面为所有独特的水平相邻像素对创建cov(x,y)
和x
,然后创建一个带有整数索引的随机排列的向量使用函数COV进入y
和x
。选择那些随机置换索引的前5000个条目将为y
和x
提供5000个随机索引:
y
这将为您提供randIndex = randperm(numel(x)); %# A random permutation of the integers
%# from 1 to numel(x)
randIndex = randIndex(1:5000); %# Pick the first 5000 indices
xRand = x(randIndex); %# 5000 random values from x
yRand = y(randIndex); %# The corresponding 5000 values from y
和x
中的5000对水平相邻像素值。但是,目前还不清楚“绘制分布”是什么意思。我猜你最终会使用函数RANDPERM或函数HIST来实现此目的。