matlab中的平均滤波器

matlab中的平均滤波器,matlab,image-processing,filter,Matlab,Image Processing,Filter,我试图计算每个像素的平均值,只计算左右邻域,但在处理结束时,我只得到一个白色图像,我找不到错误所在。这是我的密码 imageIn = imread('Prueba.jpg'); imageIn = rgb2gray(imageIn); imageOut = zeros(size(imageIn)); ny = size(imageIn, 1); nx = size(imageIn, 2); imshow(imageIn); u = []; v = []; tic for i = 1:n

我试图计算每个像素的平均值,只计算左右邻域,但在处理结束时,我只得到一个白色图像,我找不到错误所在。这是我的密码

imageIn = imread('Prueba.jpg');
imageIn = rgb2gray(imageIn);
imageOut = zeros(size(imageIn));

ny = size(imageIn, 1);
nx = size(imageIn, 2);

imshow(imageIn);

u = [];
v = [];

tic

for i = 1:ny
    u = imageIn(i,:);
    v = zeros(1, ny);
    for k = 2:ny-1
        v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)))/3;
    end
    %Special cases first and last pixel
    v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)))/3;
    v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)))/3;
    imageOut(i,:) = v;
end

toc
imshow(imageOut);

有什么想法吗?

为什么不直接创建一个第二个矩阵,它是第一个矩阵的克隆,然后将其转换,然后对两个矩阵求平均值

imIn = imread('Prueba.jpg');

nx = size(d,1);
ny = size(d,2);

% Create temporary matrices padded with nan
tmp1 = [nan(ny,2), d];
tmp2 = [d, nan(ny,2)];

imOut = tmp1;
imOut(:,:,2) = tmp2;

% use nanmean so the mean is just the value of the 1 column
imOut = nanmean(imOut,3);

out = imOut(2:end-1,:);

为什么不创建一个第二个矩阵,它是第一个矩阵的复制品,将其转换,然后对两个矩阵求平均值

imIn = imread('Prueba.jpg');

nx = size(d,1);
ny = size(d,2);

% Create temporary matrices padded with nan
tmp1 = [nan(ny,2), d];
tmp2 = [d, nan(ny,2)];

imOut = tmp1;
imOut(:,:,2) = tmp2;

% use nanmean so the mean is just the value of the 1 column
imOut = nanmean(imOut,3);

out = imOut(2:end-1,:);
试着用这个

imageIn = imread('Prueba.jpg');
imageIn = rgb2gray(imageIn);
imageOut = zeros(size(imageIn));

ny = size(imageIn, 1);
nx = size(imageIn, 2);

imshow(imageIn);

u = [];
v = [];

tic

for i = 1:ny
u = imageIn(i,:);
v = zeros(1, ny);
for k = 2:ny-1
v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)))/3;
end
%Special cases first and last pixel
v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)))/3;
v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)))/3;
imageOut(i,:) = v;
end

toc
imshow(imageOut)

试着用这个

imageIn = imread('Prueba.jpg');
imageIn = rgb2gray(imageIn);
imageOut = zeros(size(imageIn));

ny = size(imageIn, 1);
nx = size(imageIn, 2);

imshow(imageIn);

u = [];
v = [];

tic

for i = 1:ny
u = imageIn(i,:);
v = zeros(1, ny);
for k = 2:ny-1
v(k) = (uint32(u(k-1))+uint32(u(k))+uint32(u(k+1)))/3;
end
%Special cases first and last pixel
v(1) = (uint32(u(2))+uint32(u(1))+uint32(u(2)))/3;
v(ny) = (uint32(u(ny-1))+uint32(u(ny))+uint32(u(ny-1)))/3;
imageOut(i,:) = v;
end

toc

imshow(imageOut)

将代码的最后一行更改为
imagesc(imageOut)
,您将看到图像实际上不是白色的

你的代码很好;使用
imshow()
函数,图像显示为白色的原因是,在应用局部平均值后,像素强度的范围要小得多,
imshow()
使用的默认缩放比例不足以显示图像的对比度


阅读关于b/t
imshow()
imagesc()
的区别,您将看到混淆

将代码的最后一行更改为
imagesc(imageOut)
,您将看到图像实际上不是白色的

你的代码很好;使用
imshow()
函数,图像显示为白色的原因是,在应用局部平均值后,像素强度的范围要小得多,
imshow()
使用的默认缩放比例不足以显示图像的对比度


阅读关于b/t
imshow()
imagesc()
的区别,您将看到混淆

你是如何处理边缘案件的?如果一个像素没有左邻域或右邻域怎么办?当它没有左邻域时,我使用两倍的右像素,反之亦然。这就是Commo
特殊情况下的行所做的(或应该做的)。我使用matlab已经很长时间了,但我认为您可能使用整数除法,它将返回整数,而不是浮点数?如果你忽略了这一点;我相信它会在运行时输出var,所以可能每次处理完都会输出v?您是如何处理边缘情况的?如果一个像素没有左邻域或右邻域怎么办?当它没有左邻域时,我使用两倍的右像素,反之亦然。这就是Commo
特殊情况下的行所做的(或应该做的)。我使用matlab已经很长时间了,但我认为您可能使用整数除法,它将返回整数,而不是浮点数?如果你忽略了这一点;我相信它会在运行时输出var,所以可能每次处理完后都会输出v?是的,我也这么认为,但我需要做的是逐行计算左右相邻像素的平均值。所以我很感谢你的帮助,但我很想让代码正常工作。是的,我也这么认为,但我需要做的是计算左右邻域的每个像素的平均值,逐行计算。所以我很感谢你的帮助,但我很想让代码正常工作。它似乎和我写的代码一样。不管怎样,我试过了,但仍然
imageOut
是白色的,看起来确实是相同的代码。Hany Gharib,你改了什么?好像和我写的代码一样。不管怎样,我试过了,但仍然
imageOut
是白色的,看起来确实是相同的代码。Hany Gharib,你改变了什么?谢谢,实际上我刚刚找到了另一种方法,使用
imageOut=mat2gray(imageOut)
。我来看看区别。非常感谢。谢谢,实际上我刚刚找到了另一种方法,使用
imageOut=mat2gray(imageOut)
。我来看看区别。谢谢。