如何找到图像的相关性?

时间:2010-09-11 04:54:33

标签: matlab image-processing correlation

有一个固定大小为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对两个水平相邻像素,然后绘制这两个水平相邻像素的分布?

1 个答案:

答案 0 :(得分:3)

truecolor RGB images的图像处理一样,首先要解决几个关键问题。我在my answeryour other question中提到了涉及不同图像处理算法的这些,但是它们在这里重复:

  • 弄清楚如何处理第三维: RGB图像实际上是一组三个二维矩阵(每个矩阵用于像素的红色,绿色和蓝色分量)沿着第三维连接起来。在执行按像素操作时,您必须决定是否要执行三次操作(即每个颜色平面执行一次),或者是否要以某种方式沿第三维折叠值(即转换为{{ 3}}使用grayscale intensity image等函数来为您提供一组要操作的二维图像数据。
  • 注意数据类型:加载到MATLAB中的图像数据通常是RGB2GRAY形式的,但有时它可能是无符号的16-位整数或双精度类型。在处理整数类型时,在执行某些操作之前通常需要转换为unsigned 8-bit integer,以避免整数算术的某些方面,如舍入和饱和。

好的,既然这些手续已经完成,我认为上面的问题包含两个步骤。首先,您必须从图像中选择成对像素的子集,例如所有水平配对像素。其次,您必须应用上面的统计公式。在下面的例子中,我假设操作是在矩阵A的红色(即第一个)颜色平面上执行的:

  1. 选择配对像素的子集:让我们从一组独特的水平像素配对开始。如果我选择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代替每行中的最后一个索引,分别得到绿色和蓝色平面的计算。

  2. 执行统计测试:这部分很简单。已经有一个内置函数matrix indexing用于计算MATLAB中的相关系数。您可能必须首先使用CORRCOEF将像素值yx的子集重新整形为列向量:

    y

    其他公式也存在这样的函数:r_xy = corrcoef(x(:),y(:)); single-colon indexingE(x)MEAND(x)VAR

  3. 关于你的第二个问题,你可以像我上面为所有独特的水平相邻像素对创建cov(x,y)x,然后创建一个带有整数索引的随机排列的向量使用函数COV进入yx。选择那些随机置换索引的前5000个条目将为yx提供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来实现此目的。