下面是单个像素的样本协方差矩阵的代码。我已经为(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×49。最后生成的协方差矩阵是114×49×4×4×4。我应该如何应用一个方形窗口来选择目标像素的相邻像素,并继续其他像素的选择?
请提供必要的帮助,因为我花了两个月的时间来写这段代码是从一个非编码的背景。您的帮助将不胜感激。
问候
发布于 2015-12-07 13:04:52
标准的方法是使用nlfilter
。对于这个函数,您提供您的函数(计算协方差的函数),它将应用于您大小的滑动窗口。例如:
octave> img = rand (64, 64);
octave> img_cov = nlfilter (img, [10 10], @(x) cov (x(:)));
将对大小为零的每个滑动块(在将原始图像填充为零后)调用cov (x(:))
,并用这些结果返回大小为[64 64]
的数组(与输入图像相同)。由于您使用的是八度,您的窗口和图像可能有任意数量的尺寸。所以你可以这么做:
octave> img = rand (64, 64, 3, 4);
octave> img_cov = nlfilter (img, [10 10 3 4], @(x) cov (x(:)));
另一种方法是将n维图像中的所有滑动窗口都放到列中(使用im2col
),使用将沿着每一列工作的函数,然后使用col2im
构建图像。这可能会更快,也可能不会更快,但如果你能绕着它转,你就会有更大的灵活性:
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");
https://stackoverflow.com/questions/34131544
复制相似问题