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