我实现了一个平滑算法,基本上应用了一个内核:[0 1 0;
1 4 1;
0 1 0]/8
然后对矩阵(图像)进行边角校正,相当于将内核设置为
^{pr2}$
对于左边缘,以及[0 0 0;
0 6 1;
0 1 0]/8
在左上角。在
我现在的目标是应用一个平滑,只适用于图像的遮罩部分。例如(参考下面的图像),如果我有一个磁盘的正方形图像,其中磁盘的值为128+-10(+-10是一种噪声效果),并且背景是黑色(值为0),则无限次应用的普通平滑算法应该会生成一个像素强度恒定的方形图像。对于蒙版平滑算法,我想遮罩磁盘,使算法应用无限次应给出一个均匀的磁盘在128和一个黑色(0)背景。换句话说,只有磁盘是平滑的。在
我试图避免的主要问题是背景“流血”到磁盘中,使磁盘边缘变得模糊。我也愿意改变平滑算法的一些不同的东西(例如,3x3像素的平均值),将允许一个更有效的方法。在
(噪声源)
(在正常平滑之后)
(蒙面后平滑)
以下是我的正常平滑代码:def SmoothImage(Matrix,N=1):
'''Smooths a Matrix with kernel [0 1 0; 1 4 1; 0 1 0]/8'''
A=Matrix.copy()
for i in range(N):
s=A.shape[0]-1
B=A*4.0
B[-s:,:]+=A[:s,:]
B[0,:]+=A[0,:]
B[:,-s:]+=A[:,:s]
B[:,0]+=A[:,0]
B[:s,:]+=A[-s:,:]
B[-1,:]+=A[-1,:]
B[:,:s]+=A[:,-s:]
B[:,-1]+=A[:,-1]
B*=1/8
A=B
return A