在192x192x24体积中平均超过3x3x3体素

use*_*268 1 matlab image image-processing voxel

我正在处理具有测量强度的图像文件,基本上提取尺寸为1x1x1像素的体素.图像文件形成一个体积以避免峰值强度.我想找到一种平均超过3x3x3像素的方法.

我的问题是解决问题,因为它是图像中由零和其他值分隔的形状.所以,我首先考虑for使用if-statement -loop .这些是我迄今为止为for-loop和if-statement 所做的考虑.MATLAB将体积视为长矩阵,因此通过简单的for循环,应该很容易找到非零值及其相邻值,并取平均值.当我不得不考虑z维度时,问题就出现了.

这显然不是最佳工作,我发现很难解释边界效应.

ray*_*ica 6

我希望我正确地解释你的问题,但你想找到输入图像中每个体素的3 x 3 x 3体素体积的平均值,其中每个输入体素充当每个3 x 3 x 3体素体积的中心被平均.如果您可以选择使用MATLAB的内置函数,请考虑使用ND卷积convn.不要在这里使用循环,因为它会非常慢.将flag作为第三个可选参数.该平均机制还假设外边缘是零填充的.convn,第一个参数是3D图像,第二个参数是3 x 3 x 3内核,其值均等于1/27.如果卷积内核超出输入图像的限制,您还可以选择指定沿边界发生的情况.通常,您希望返回与输入大小相同的输出图像,因此您可能希望指定'same'

因此,假设您的图像存储在im,请执行以下操作:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = convn(double(im), kernel, 'same'); %// Cast to double for precision

out = cast(out, class(im)); %// Recast back to original data type
Run Code Online (Sandbox Code Playgroud)

或者,如果您有权访问图像处理工具箱,请imfilter改用.与此不同的convn是imfilter使用英特尔集成性能基元(IIPP)编写的,因此性能肯定会更快:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = imfilter(im, kernel);
Run Code Online (Sandbox Code Playgroud)

额外的好处是您不需要更改输入类型. imfilter自动推断出这一点,是否与输入图像的原始类型和输出类型相关imfilter的处理与输入类型相同.在使用之前convn,必须确保数据是浮点数.