有一个固定大小为256 * 256 * 3(RGB)的图像 A
. 众所周知,图像中两个相邻像素值之间协方差的数学公式为:
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对两个水平相邻像素,然后绘制这两个水平相邻像素的分布?
1 回答
与truecolor RGB images的图像处理一样,首先要解决几个关键问题 . 我在my answer中提到了这些涉及不同图像处理算法的your other question,但它们在这里重复:
Figuring out how to deal with the third dimension: RGB图像实际上是沿着第三维连接的三个2-D矩阵的集合(每个矩阵对应于像素的红色,绿色和蓝色分量) . 在执行逐像素操作时,您必须决定是否要执行三次操作(即每个颜色平面执行一次),或者您是否要以某种方式沿第三维折叠值(即转换为grayscale intensity image函数如RGB2GRAY)为您提供一组要操作的二维图像数据 .
Be mindful of data types: 加载到MATLAB中的图像数据通常采用unsigned 8-bit integer的形式,但有时可以是无符号的16位整数或双精度类型 . 处理整数类型时,通常需要在执行某些操作之前转换为double precision,以避免整数运算的某些方面,如舍入和饱和 .
好了,既然这些手续已经完成,我认为上面的问题包含两个步骤 . 首先,您必须从图像中选择成对像素的子集,例如所有水平配对像素 . 其次,您必须应用上面的统计公式 . 在下面的例子中,我假设操作是在矩阵
A
的红色(即第一个)颜色平面上执行的:A
的第一列中的像素并将它们放在子集x
中,那么水平相邻的像素将是A
的第二列中的像素,并且这些像素将被放置在子集y
中 . 我还可以将第二列中的像素添加到子集x
,然后将第三列中的水平相邻像素放置在子集y
中 . 对A
中的所有列重复此操作,我们可以看到第1列到第255列中的像素将位于子集x
中,第2列到第256列中的像素将位于子集y
中 . 因此,matrix indexing看起来像这样:遵循与上面类似的逻辑,您可以以这种方式构造整组唯一的垂直像素对:
同样对于一组独特的对角线像素配对,其中“对角线”在矩阵中从左上角到右下角:
或者对于“反对角线”,其中“对角线”在矩阵中从左下角到右上角:
现在,您可以选择这些
x
和y
数据集中的任何一个来执行红色平面所需的统计计算 . 您可以重复上面的操作,用2或3代替每行中的最后一个索引,分别得到绿色和蓝色平面的计算 .x
和y
重新整形为列向量:其他公式也存在函数:MEAN表示
E(x)
,VAR表示D(x)
,COV表示cov(x,y)
.关于你的第二个问题,你可以像我上面对所有独特的水平相邻像素对一样创建
x
和y
,然后使用函数RANDPERM创建一个带有整数索引的随机排列的矢量到x
和y
. 选择那些随机置换索引的前5000个条目将为x
和y
提供5000个随机索引:这将为您提供
x
和y
中的5000对水平相邻像素值 . 但是,目前还不清楚你的意思是"plot the distribution" . 我猜你最终会使用函数HIST或函数SCATTER为此目的 .