每个像素的样本协方差矩阵(获取相邻像素)并应用整个图像维度

时间:2015-12-07 10:37:45

标签: image matlab image-processing matrix octave

以下是单个像素的样本协方差矩阵的代码。我已经为包括堆叠图像的第一像素的(1,1)采用了10个相邻像素。 y_1,y_2,y_3和y_4是我的四张照片。 如果问题不明确,请告诉我。

y_cal=cat(3, y_1, y_2, y_3, y_4);

Y_new=reshape(y_cal, [5586, 4]);

Y_new_cov=Y_new(1:10,:);

Y_new_cell = arrayfun(@(ri) Y_new_cov(ri, :)', 1:10, 'UniformOutput', 0);

Y_new_cell_tr= cellfun(@ctranspose, Y_new_cell , 'UniformOutput', 0);

Y_covariance_initial = cellfun(@mtimes, Y_new_cell,Y_new_cell_tr, 'UniformOutput', 0);

Y_covariance_final = Y_covariance_initial{1,1}+Y_covariance_initial{1,2}+Y_covariance_initial{1,3}+Y_covariance_initial{1,4}+Y_covariance_initial{1,5}+Y_covariance_initial{1,6}+Y_covariance_initial{1,7}+Y_covariance_initial{1,8}+Y_covariance_initial{1,9}+Y_covariance_initial{1,10};

这里手动拍摄了10个像素,其中实现了协方差。我的图像尺寸为114 X 49.所以生成的最终协方差矩阵是114 X 49 x 4 X 4.我应该如何应用方形窗口来选择目标像素的相邻像素并继续其他像素?

请提供必要的帮助,因为我花了两个月的时间来编写非编码背景的代码。我们将非常感谢您的帮助。

此致

1 个答案:

答案 0 :(得分:3)

标准方法是使用nlfilter。对于此功能,您提供功能(计算协方差的功能),并将其应用于您的大小的滑动窗口。例如:

octave> img = rand (64, 64);
octave> img_cov = nlfilter (img, [10 10], @(x) cov (x(:)));

将为每个大小为cov (x(:))的滑块调用[10 10](在用零填充原始图像之后),并返回一个大小为[64 64]的数组(与输入图像相同)那些结果。由于您使用的是Octave,因此您的窗口和图像可能具有任意数量的维度。所以你可以这样做:

octave> img = rand (64, 64, 3, 4);
octave> img_cov = nlfilter (img, [10 10 3 4], @(x) cov (x(:)));

另一种方法是将你的n维图像中的所有滑动窗口放到一列中(使用im2col),使用一个可以在每列上工作的函数,然后使用{{3}构建一个图像}。这可能会,也可能不会更快,但如果你可以扭曲它,它会给你更多的灵活性:

octave> img = rand (64, 64);
octave> im_cols = im2col (img, [10 10], "sliding");
octave> im_cov = you_nd_cov_function (im_cols);
octave> img_cov = col2im (cov (im_cols), [1 1], [55 55], "sliding");