首页 文章

如何找到图像的相关性?

提问于
浏览
0

有一个固定大小为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 回答

  • 3

    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 的红色(即第一个)颜色平面上执行的:

    • Selecting subsets of paired pixels: 让我们从一组独特的水平像素配对开始 . 如果我选择 A 的第一列中的像素并将它们放在子集 x 中,那么水平相邻的像素将是 A 的第二列中的像素,并且这些像素将被放置在子集 y 中 . 我还可以将第二列中的像素添加到子集 x ,然后将第三列中的水平相邻像素放置在子集 y 中 . 对 A 中的所有列重复此操作,我们可以看到第1列到第255列中的像素将位于子集 x 中,第2列到第256列中的像素将位于子集 y 中 . 因此,matrix indexing看起来像这样:
    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
    

    现在,您可以选择这些 xy 数据集中的任何一个来执行红色平面所需的统计计算 . 您可以重复上面的操作,用2或3代替每行中的最后一个索引,分别得到绿色和蓝色平面的计算 .

    • Performing the statistical tests: 这部分很简单 . 已经有一个内置函数CORRCOEF用于在MATLAB中计算相关系数 . 您可能必须首先使用single-colon indexing将像素值的子集 xy 重新整形为列向量:
    r_xy = corrcoef(x(:),y(:));
    

    其他公式也存在函数:MEAN表示 E(x)VAR表示 D(x)COV表示 cov(x,y) .

    关于你的第二个问题,你可以像我上面对所有独特的水平相邻像素对一样创建 xy ,然后使用函数RANDPERM创建一个带有整数索引的随机排列的矢量到 xy . 选择那些随机置换索引的前5000个条目将为 xy 提供5000个随机索引:

    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
    

    这将为您提供 xy 中的5000对水平相邻像素值 . 但是,目前还不清楚你的意思是"plot the distribution" . 我猜你最终会使用函数HIST或函数SCATTER为此目的 .

相关问题