![]() |
如何找到图像的相关性?
有一个固定尺寸为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是这两个图像的两个水平,垂直和对角线相邻像素之间的相关系数。 [B]问题1:[/B]如何在MATLAB中进行上述计算? [B]Q2:[/B]如何从图像中随机选择5000对两个水平相邻像素,然后绘制这两个水平相邻像素的分布? [B]回答:[/B] 正如处理[URL="http://www.mathworks.com/help/techdoc/creating_plots/f2-10709.html#f2-12468"]真彩色RGB图像的[/URL]典型处理一样,首先要解决几个关键问题。我在[URL="https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab/3691909#3691909"]回答[/URL] [URL="https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab"]其他[/URL]涉及不同图像处理算法的[URL="https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab"]问题时[/URL] [URL="https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab/3691909#3691909"]回答[/URL]了这些[URL="https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab"]问题[/URL] ,但此处需要重复: [LIST][*] [B]弄清楚如何处理三维:[/B] RGB图像实际上是沿着三维连接在一起的一组三个二维矩阵(每个像素的红色,绿色和蓝色分量)。在执行逐像素操作时,您必须决定是要执行三次操作(即每个颜色平面一次)还是要以某种方式折叠第三维的值(即转换为[URL="http://www.mathworks.com/help/techdoc/creating_plots/f2-10709.html#f2-175"]灰度强度)[/URL]具有[URL="http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.html"]RGB2GRAY之类的[/URL]功能的[URL="http://www.mathworks.com/help/techdoc/creating_plots/f2-10709.html#f2-175"]图像[/URL] ),以提供一组要操作的二维图像数据。[*] [B]请注意数据类型:[/B]加载到MATLAB中的图像数据[I]通常[/I]采用[URL="http://www.mathworks.com/help/techdoc/ref/uint8.html"]无符号8位整数的形式[/URL] ,但有时它可以是无符号16位整数或双精度类型。在处理整数类型时,通常需要在执行某些操作之前转换为[URL="http://www.mathworks.com/help/techdoc/ref/double.html"]双精度[/URL] ,以避免整数运算的某些方面(例如舍入和饱和)。[/LIST]好了,既然这些手续已不复存在,我认为您的上述问题包括两个步骤。首先,您必须从图像中选择配对像素的子集,例如所有水平配对的像素。其次,您必须应用上面的统计公式。在下面的示例中,我假设操作是在矩阵A的红色(即第一个)彩色平面上执行A : [LIST=1][*] [B]选择成对像素的子集:[/B]让我们从一组独特的像素水平配对开始。如果我在A的第一列中选择像素并将其放置在子集x ,则水平相邻的像素将在A的第二列中,并将它们放置在子集y 。我还可以将第二列中的像素添加到子集x ,然后将第三列中水平相邻的像素放置在子集y 。对A所有列重复此操作,我们可以看到第1到255列中的像素将在子集x ,而第2到256列中的像素将在子集y 。因此, [URL="http://www.mathworks.com/help/techdoc/math/f1-85462.html#f1-85544"]矩阵索引[/URL]将如下所示: 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和y数据集中的任何一组来执行您想要的红色平面的统计计算。您可以重复上述操作,将每行的最后一个索引替换为2或3,以分别计算绿色和蓝色平面。 [*] [B]执行统计测试:[/B]这部分很简单。已经有一个内置函数[URL="http://www.mathworks.com/help/techdoc/ref/corrcoef.html"]CORRCOEF[/URL]用于在MATLAB中计算相关系数。您可能必须首先使用[URL="http://www.mathworks.com/help/techdoc/math/f1-85462.html#bq7egbu-1"]单冒号索引[/URL]将像素值x和y的子集重塑为列向量: r_xy = corrcoef(x(:),y(:)); 其他公式也有函数: E(x) [URL="http://www.mathworks.com/help/techdoc/ref/mean.html"]MEAN[/URL] , D(x) [URL="http://www.mathworks.com/help/techdoc/ref/var.html"]VAR[/URL] , cov(x,y) [URL="http://www.mathworks.com/help/techdoc/ref/cov.html"]COV[/URL] 。 [/LIST]关于第二个问题,您可以像上面我一样为水平相邻像素的所有唯一对创建x和y ,然后使用函数[URL="http://www.mathworks.com/help/techdoc/ref/randperm.html"]RANDPERM[/URL]创建一个整数索引随机排列为x和y的[URL="http://www.mathworks.com/help/techdoc/ref/randperm.html"]向量[/URL] 。选择那些随机排列的索引的前5000个条目将使您在x和y 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 这将为您提供x和y 5000对水平相邻像素值。但是,不清楚“绘制分布”是什么意思。我猜您将为此目的而使用[URL="http://www.mathworks.com/help/techdoc/ref/hist.html"]HIST[/URL]函数或[URL="http://www.mathworks.com/help/techdoc/ref/scatter.html"]SCATTER[/URL]函数。 [url=https://stackoverflow.com/questions/3689840]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 08:33。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.