用于图像增强的中值滤波器或其他滤波器的Matlab代码

时间:2013-11-08 14:03:15

标签: matlab image-processing

我是matlab的新手,我对数字图像处理主题知之甚少。在这个主题中,我选择了基本上用于增强图像的图像增强主题。我只研究了一些增强技术理论部分,所以我不知道如何在图像上应用滤镜,甚至我没有在互联网上找到适当的matlab代码中间滤波器和正确的解释。请告诉我中位滤波器或其他滤波器的matlab代码,这很容易理解我。

3 个答案:

答案 0 :(得分:2)

Matlab有一个用于图像中值滤波的内置函数medfilt2d

如果您想设计自己的过滤器并玩游戏,可以使用imfilter应用线性过滤器(即使用离散内核卷积图像)和nlfilter非线性过滤器。

示例: (中位数过滤器)

如果您想使用A窗口对图片NxN应用中值过滤器,可以通过

拥有自己的过滤工具
my_median = @(x) median(x(:))
A_filtered = nlfilter(A,[N N], my_median );

为了使其更清晰,matlab将在整个图像“隔离子图像”上滑动NxN窗口。 函数my_median(计算展平(即连续拉伸)子图像的中位数)将应用于每个子图像。

因此,如果您将my_median替换为my_max = @(x) max(x(:)),则会有最大过滤器等等。

答案 1 :(得分:1)

根据您的需要,您首先需要定义“相关像素”网格,例如当前像素的第一个周围像素。然后计算这些值的均值或中值,并将其分配给当前像素位置。从找到邻域像素的函数开始:

1。)扩展您的图像以便为边框设置“邻域像素”并从此模板定义相关的x,y坐标(当然,您还需要使用padarray扩展图像(只需查看函数引用)以对称或任何方式获得某些信息):

  logical_tmp = padarray(logical(ones(xdim,ydim)),[range range]);
  [xc,yc] = meshgrid((1:xdim)+range,(1:ydim)+range);
  indices = int32(sub2ind(size(logical_tmp),yc(:),xc(:)));

2.。)根据指定的范围定义偏移量并计算周围像素的指数:

  offset1 = [-range:range]; 
  offset2 = offset1.*xdim;
  offs3 = (offset2+offset1);
  pre1 = length(offset1);
  for u=1:length(offset3)
    neighbor_offsets(1+((u-1)*pre1):pre1+((u-1)*pre1)) = offs3(u)+offs1;
  end
  neighbor_offsets = int32(sort(neighbor_offsets,'ascend'));
  neighbors = int32(bsxfun(@plus,indices,neighbor_offsets)); %Indices of neighbours

至少我最近为自己找到了一种方法。也许有更好的方法来做到这一点。最后,您需要应用上面提到的过滤器。例如,通过逐行计算所提到的中值或平均值并将其应用于当前位置,可以迭代地完成(1:size_1d [图像])。

答案 2 :(得分:1)

没有内置功能???是什么原因?为什么你应该在那种情况下使用Matlab?好吧,但是这里是“没有”内置函数最简单的方法:

1。)主要功能

function main_function()
  % Read your image
  old_image = imread('yourimage.tif');

  % Loop over each pixel
  for x=1:xdim %loop in x-dimension
    for y=1:ydim % loop in y-dimension
      new_image(x,y) = filter_function(old_image,x,y);
    end
  end
end

所以这里发生了什么。首先,您使用内置函数imread()将图像读入矩阵。如果你不允许使用它......好吧......使用它。 :P编程的好处是,对于很多问题,已经存在非常好的解决方案。因此,强烈建议在每种编程语言中至少使用一些内置函数或库。 之后,根据filter_function和new_image中的old_image,有两个循环为每个位置(x,y)分配一个新值,最初可以将其视为一个空矩阵。

2.。过滤功能

function median_value = filter_function(old_image,x,y)
  grid_size = 1;
  neighbors = old_image(x-grid_size:x+grid_size,y-grid_size:y+grid_size);
  %Look for some basic code, that sorts all "neighbor"-values and pick the value in the middle = MEDIAN *
  median_value = from_your_function;
end

过滤函数迭代计算应分配给过滤图像的所有新值。所以我们要做的是: a。)找到所有相邻的像素, b。)计算中位数, c。)返回它作为此函数的返回变量。 线 neighbors = ... 当然存在问题。在图像的边界会发生什么?通过在各个方向扩展old_image,我已经告诉过你一个解决方案。如果你想为此编写自己的函数,你可以这样做,但有利的当然是函数padarray()。当然,该解决方案可能会产生更多问题,例如如何将扩展矩阵上的相应位置定义为new_image,当然应该具有与old_image相同的大小。解决方案也在我的第一个回复中。尽管如此,您还可以决定在边界处继续使用较少的信息,并编写一些只读取“真实”像素的函数。

注意:除非您解决了borderpixels的问题,否则此代码将无效。

最好的问候。