Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 192x192x24体积中3x3x3体素的平均值_Image_Matlab_Image Processing_Voxel - Fatal编程技术网

Image 192x192x24体积中3x3x3体素的平均值

Image 192x192x24体积中3x3x3体素的平均值,image,matlab,image-processing,voxel,Image,Matlab,Image Processing,Voxel,我正在处理测量强度的图像文件,基本上提取1x1x1像素大小的体素。图像文件形成一个体积以避免峰值强度。我想找到一种方法,平均超过3x3像素 我的问题是让我的头绕过这个问题,因为它是图像中由零和其他值分隔的形状。所以,首先我考虑了一个带有if-语句的for-循环。这些是我到目前为止为for-循环和if-语句所做的考虑。MATLAB将体积视为一个长矩阵,因此通过一个简单的for循环,应该很容易找到一个非零值及其相邻值,并取这些值的平均值。当我不得不考虑z维度时,问题就来了 这显然不是最优的,我发现很

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

我的问题是让我的头绕过这个问题,因为它是图像中由零和其他值分隔的形状。所以,首先我考虑了一个带有
if
-语句的
for
-循环。这些是我到目前为止为
for
-循环和
if
-语句所做的考虑。MATLAB将体积视为一个长矩阵,因此通过一个简单的
for
循环,应该很容易找到一个非零值及其相邻值,并取这些值的平均值。当我不得不考虑z维度时,问题就来了


这显然不是最优的,我发现很难解释边界效应。

我希望我正确地解释了你的问题,但你想找到输入图像中每个体素的3 x 3 x 3体素体积的平均值,其中每个输入体素充当每个3 x 3 x 3体素体积的中心,以进行平均。如果你有选择使用MATLAB的内置函数,考虑使用N-D卷积。不要在这里使用循环,因为它会非常慢。对于
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

或者,如果您可以访问图像处理工具箱,请使用。这与
convn
的区别在于
imfilter
是使用编写的,因此性能肯定会更快:

%// 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);

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

我希望我正确地解释了您的问题,但您希望找到输入图像中每个体素的3 x 3 x 3体素体积的平均值,其中每个输入体素充当每个3 x 3 x 3体素体积的平均值中心。如果你有选择使用MATLAB的内置函数,考虑使用N-D卷积。不要在这里使用循环,因为它会非常慢。对于
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

或者,如果您可以访问图像处理工具箱,请使用。这与
convn
的区别在于
imfilter
是使用编写的,因此性能肯定会更快:

%// 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);
额外的好处是您不需要更改输入类型
imfilter
自动推断,输入图像的原始类型和
imfilter
的输出类型是否与输入类型相同。使用
convn
,在使用数据之前必须确保数据是浮点型的