我是matlab新手,对数字图像处理学科也没有太多了解。在这门学科中,我选择了图像增强主题,主要用于增强图像。我研究了一些增强技术,只是理论部分,所以我不知道如何在图像上应用过滤器,甚至我还没有在中值滤波器的互联网上找到适当的 matlab 代码并有适当的解释。请告诉我中值滤波器或其他易于理解的滤波器的 matlab 代码。
3 回答
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(:))
您将有一个最大过滤器等等。
没有内置函数???这是什么原因?在这种情况下,为什么要使用 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.)将其作为该函数的返回变量返回。当然,现在线路邻居有问题= .... 图像的边界会发生什么?我已经告诉过你一个解决方案,通过向各个方向扩展 old_image。如果你想为此编写自己的函数,你可以这样做,但当然有利的是函数 padarray()。当然,该解决方案可能会出现更多问题,例如如何将扩展矩阵上的相应位置定义为 new_image,当然应该与 old_image 具有相同的大小。解决方案也在我的第一个回复中。尽管如此,您也可以决定在边界处使用较少的信息并编写一些仅读取“真实”像素的函数。
注意:除非您解决了边框像素的问题,否则此代码将不起作用。
此致。
根据您的需要,您首先需要定义一个“相关像素”网格,例如当前像素的第一个周围像素。之后,您计算这些值的平均值或中值并将其分配给当前像素位置。从查找邻域像素的函数开始:
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 [of your image])。