目录
边界问题
解决边界方法
裁剪
环绕
复制边缘
反射
Matlab实战
边界问题
进行过滤时出现的一件事是如何处理边界,因为您可能会问当过滤器脱离边缘时会发生什么。
当您的过滤器掉落边缘时会发生什么?
所以你必须考虑你想要的大小操作,这样就可以这样说明。
在这里,我们将使用一些旧的MatLab命名法,他们已经改变了它,因为旧的MatLab命名法实际上已经清楚了。如图:
这里我有一个函数f,我用g过滤它。
你可能会试着好好考虑一下,我想要的尺寸输出是多少。
并且有三种不同的可能尺寸。
一个是当g刚触及那个角落时,我开始得到反馈。
因此,如果我将g的中心点视为参考,我实际上会得到一个比原始函数更大的盒子。
另一方面,如果我想确保所有g实际上都是触摸f,那么我将再次使用中心点,最后我的输出比原来的要小。如图
而且,这被称为有效,因为所有这些点实际上都是正确的。
但问题是当我过滤55*55的图像时,我真的想要回55*55。
我不想回到58*58或52*52。
我想要的是同样的。如图:
所以在这里你看到我们把那个过滤器的中间放在角落里,然后我们回到相同的大小。
那么问题当然,是在这些像素下面突然出现了什么?
基本上当你进行过滤时,你必须告诉系统你想要什么。
解决边缘方法
MATLAB有几种方法可以考虑如何做到这一点。
我们将再次使用旧的MATLAB命名法,然后我将告诉你有关新的命名法。
所以有几种不同的方法。
裁剪
第一种方法叫做clip(裁剪)。看图
Clip基本上意味着:我假设外边界是黑色的。
然后我应用我的过滤器,所以在这里我可以看到我的过滤器。
当我拿出图像时,你会注意到这个东西在边缘变得很暗。
这是有道理的,因为黑色已经泄露。如图:
但那被称为裁剪。
环绕
另一种方法称为环绕。这是一种奇怪的方法。
它与我们稍后将讨论的一些傅里叶分析(重点知识)有关。
基本上它说我假设我的照片连续并且链接在一起。如图:
这意味着:你看到了边界那里被填写了东西。如图:
这就是图片这一侧的内容。这里更容易看到。
这些,这些红辣椒来自这里。
黄色的稻草来自那边。
这是假设您实际看到的是周期性信号。所以,如果您正在查看周期性信号。
接下来会发生的事情就是它开始时的东西。
那么,在过滤中,在图像过滤中,这不能很好地工作。
在这里,我将应用滤镜,然后我将剪切回原始尺寸的图像。
你会注意到这里有一些红色的东西。如图:
红色的东西来自哪里?
它实际上是从底部来的,因为它缠绕着。如图:
复制边缘
有一种称为复制边缘或复制的方法,你基本上可以扩展出来。原始图:
所以我只是扩展了相同的值。如图:
然后我运行我的过滤器,然后我拿出我的照片,这是合理的。如图:
复制方法是一个简单的方法,它给你一个合理的结果。
它基本上保持图像类型不变。
现在的问题是,统计数据当然是不同的。
因为你有这个漂亮的变化图像,然后你让一切都变得相同。
反射
因此,另一种方法称为反射。好的,有时被称为对称的。
那就是你,你反映出来的形象。原始图像:
在这里,我就是这样做的。如图:
事实上,让我在这里画画。
这是反射边缘。
实际上,如果我擦除它,很难看到那个边缘。
因为我基本上是,我拍摄图像然后再将它折叠起来。
所以,我把它拿出来。我应用我的过滤器。如图:
然后我拿出图像,它实际上做得很好。
所以,通常你要么想做所谓的复制,要么复制边缘或反射整个图像。
在新的MATLAB中,这些使用名为imfilter的函数表示,它来自图像处理工具箱。
你可以输入一个值。将该值放入,所以我们输入0,就像剪切一样。如图:
你可以用圆形环绕,然后复制边缘是复制的,反射是对称的。通常,您将使用复制或对称。如图:
小测验:
处理边界条件的反射方法是,在滤波中由于:
A)创建的图像具有与原始图像相同的统计数据。
B)计算是这些方法中最便宜的。
C)将像素设置为零很快。
D)以上都不是。
答案:C。A是校正的。通过执行该反射创建的图像具有相同的统计信息。B是错误的,这种计算对电脑来说无关要紧的。
Matlab实战
那么哪个是您最喜欢的处理边界问题的选择?
加载图像包,读取图像,创建高斯滤波器。
>> pkg load image;
>>
>> img = imread('fall-leaves.png');
>> imshow(img);
>>
>> filter_size = 21;
>> filter_sigma = 3;
>> filter = fspecial('gaussian', filter_size, filter_sigma);
记住高斯是特别的(指的是函数fspecial)。
现在,当您应用它时,请指定边参数。传入0等于默认值。
>> smoothed = imfilter(img, filter, 0);
运行代码,你可以看到沿着所有边界的黑色渗透。如图:
这是因为我们传入0。如果我们输入其他数字会怎么样?
试试看。输入圆形怎么样?
>> smoothed = imfilter(img, filter, ‘circular’);
运行代码,如图:
如果你仔细观察,你会看到这边的绿色渗透,而另一边则是一点点红色。
试试复制。
>> smoothed = imfilter(img, filter, ‘replicate’);
运行代码,如图:
复制并不算太糟糕。没有明显的影响。
最后尝试对称,或称为跨边界反射。
>> smoothed = imfilter(img, filter, ‘symmetric’);
也不错,实际上与复制没有太大区别。
您可以随意尝试这些不同的选项,过滤器大小和Sigma。
——学会编写自己的代码,才能练出真功夫。