我是新手,我也没有太多的数字图像处理subject.In这个主题的知识,我选择了图像增强的主题,这基本上是用来增强图像。我研究了一些增强技术,只有理论部分,所以我不知道如何在图像上应用滤波器,甚至我还没有找到合适的matlab代码在互联网上的中值滤波器与适当的explaination.Please告诉我中值滤波器或其他滤波器的matlab代码,很容易理解我。
发布于 2013-11-08 22:22:42
Matlab有一个内置的图像中值滤波功能-- medfilt2d。
如果你想设计自己的滤镜,你可以使用imfilter来应用线性滤镜(例如,用离散内核卷积你的图像),使用nlfilter来应用非线性滤镜。
示例:(中值滤波)
如果您希望使用NxN窗口对图像A应用中值滤波,您可以通过以下方式使用自己的过滤工具
my_median = @(x) median(x(:))
A_filtered = nlfilter(A,[N N], my_median );为了更清楚,matlab将在整个图像上滑动一个NxN窗口来“隔离子图像”。将在每个子图像上应用函数my_median (它计算平坦(即在一行中拉伸)子图像上的中位数)。
因此,如果您用my_max = @(x) max(x(:))替换my_median,您将拥有一个最大过滤器,等等。
发布于 2013-11-08 22:17:32
根据您的需要,您首先需要定义一个“相关像素”的网格,例如当前像素的第一个周围像素。然后,计算这些值的平均值或中位数,并将其分配给当前像素位置。从查找邻域像素的函数开始:
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)。
发布于 2013-11-08 23:17:45
没有内置函数?这是什么原因呢?在这种情况下,为什么要使用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()将图像读取到一个矩阵中。如果不允许您使用该either...well...use,请执行此操作。:P编程的好处是,对于许多问题,已经有了非常好的解决方案。因此,强烈建议在每种编程语言中至少使用一些内置函数或库。之后有两个循环,基于new_image中的filter_function和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;
endfilter函数迭代地计算应该分配给滤波图像的所有新值。所以我们在这里要做的是:a.)找到所有相邻的像素,b.)计算中值,c.)返回它作为这个函数的返回变量。当然,现在有一个问题,行neighbors = ....图像的边界发生了什么?我已经告诉过您一个解决方案,通过在所有方向上扩展old_image。如果你想为此编写你自己的函数,你可以这样做,当然最好是padarray()函数。当然,该解决方案可能会产生更多的问题,比如如何定义与new_image在扩展矩阵上的对应位置,该位置当然应该具有与old_image相同的大小。解决方案也在我的第一个回复中。然而,您也可以决定在边界上继续使用较少的信息,并编写一些仅读取“真实”像素的函数。
注意:除非您解决了边界像素的问题,否则此代码将不起作用。
诚挚的问候。
https://stackoverflow.com/questions/19860900
复制相似问题