十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
borderType= None)函数
站在用户的角度思考问题,与客户深入沟通,找到栾城网站设计与栾城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广、主机域名、网页空间、企业邮箱。业务覆盖栾城地区。
此函数利用高斯滤波器平滑一张图像。该函数将源图像与指定的高斯核进行卷积。
src:输入图像
ksize:(核的宽度,核的高度),输入高斯核的尺寸,核的宽高都必须是正奇数。否则,将会从参数sigma中计算得到。
dst:输出图像,尺寸与输入图像一致。
sigmaX:高斯核在X方向上的标准差。
sigmaY:高斯核在Y方向上的标准差。默认为None,如果sigmaY=0,则它将被设置为与sigmaX相等的值。如果这两者都为0,则它们的值会从ksize中计算得到。计算公式为:
borderType:像素外推法,默认为None(参考官方文档 BorderTypes
)
在图像处理中,高斯滤波主要有两种方式:
1.窗口滑动卷积
2.傅里叶变换
在此主要利用窗口滑动卷积。其中二维高斯函数公式为:
根据上述公式,生成一个3x3的高斯核,其中最重要的参数就是标准差 ,标准差 越大,核中心的值与周围的值差距越小,曲线越平滑。标准差 越小,核中心的值与周围的值差距越大,曲线越陡峭。
从图像的角度来说,高斯核的标准差 越大,平滑效果越不明显。高斯核的标准差 越小,平滑效果越明显。
可见,标准差 越大,图像平滑程度越大
参考博客1:关于GaussianBlur函数
参考博客2:关于高斯核运算
在图像处理以及图像特效中,经常会用到一种成高斯分布的蒙版,蒙版可以用来做图像融合,将不同内容的两张图像结合蒙版,可以营造不同的艺术效果。
I=M∗F+(1−M)∗B
这里I 表示合成后的图像,F 表示前景图,B 表示背景图,M 表示蒙版,或者直接用 蒙版与图像相乘, 形成一种渐变映射的效果。如下所示。
I=M∗F
这里介绍一下高斯分布蒙版的特性,并且用Python实现。
高斯分布的蒙版,简单来说,就是一个从中心扩散的亮度分布图,如下所示:
亮度的范围从 1 到 0, 从中心到边缘逐渐减弱,中心的亮度值最高为1,边缘的亮度值最低为 0. 图像上任何一点的亮度值为:
G(i,j)=exp−d2R
其中 i,j 表示图像上任何一点的坐标,以左上角为坐标原点,d 表示 图像上任何一点 到图像中心点的距离,R 表示图像的半径。假设图像的高为 H 宽为 W
R=(H/2)2+(W/2)2−−−−−−−−−−−−−−√=12H2+W2−−−−−−−−√
d=(i−H/2)2+(j−W/2)2−−−−−−−−−−−−−−−−−−−√
IMAGE_WIDTH = 512IMAGE_HEIGHT = 392center_x = IMAGE_WIDTH/2center_y = IMAGE_HEIGHT/2R = np.sqrt(center_x**2 + center_y**2)Gauss_map = np.zeros((IMAGE_HEIGHT, IMAGE_WIDTH))# 利用 for 循环 实现for i in range(IMAGE_HEIGHT):
for j in range(IMAGE_WIDTH):
dis = np.sqrt((i-center_y)**2+(j-center_x)**2)
Gauss_map[i, j] = np.exp(-0.5*dis/R)# 直接利用矩阵运算实现mask_x = np.matlib.repmat(center_x, IMAGE_HEIGHT, IMAGE_WIDTH)mask_y = np.matlib.repmat(center_y, IMAGE_HEIGHT, IMAGE_WIDTH)x1 = np.arange(IMAGE_WIDTH)x_map = np.matlib.repmat(x1, IMAGE_HEIGHT, 1)y1 = np.arange(IMAGE_HEIGHT)y_map = np.matlib.repmat(y1, IMAGE_WIDTH, 1)y_map = np.transpose(y_map)Gauss_map = np.sqrt((x_map-mask_x)**2+(y_map-mask_y)**2)Gauss_map = np.exp(-0.5*Gauss_map/R)# 显示和保存生成的图像plt.figure()
plt.imshow(Gauss_map, plt.cm.gray)
plt.imsave('out_2.jpg', Gauss_map, cmap=plt.cm.gray)
plt.show()
参考文献:阮一峰的网络日志
通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。
"模糊"的算法有很多种,其中有一种叫做 "高斯模糊" (Gaussian Blur)。它将 正态分布 (又名"高斯分布")用于图像处理。
本文介绍"高斯模糊"的算法,你会看到这是一个非常简单易懂的算法。本质上,它是一种 数据平滑技术 (data smoothing),适用于多个场合,图像处理恰好提供了一个直观的应用实例。
一、高斯模糊的原理
所谓"模糊",可以理解成每一个像素都取周边像素的平均值。
上图中,2是中间点,周边点都是1。
"中间点"取"周围点"的平均值,就会变成1。在数值上,这是一种"平滑化"。在图形上,就相当于产生"模糊"效果,"中间点"失去细节。
显然,计算平均值时,取值范围越大,"模糊效果"越强烈。
上面分别是原图、模糊半径3像素、模糊半径10像素的效果。模糊半径越大,图像就越模糊。从数值角度看,就是数值越平滑。
接下来的问题就是,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?
如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。
二、正态分布的权重
正态分布显然是一种可取的权重分配模式。
在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
三、高斯函数
上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。
正态分布的密度函数叫做 "高斯函数" (Gaussian function)。它的一维形式是:
[图片上传失败...(image-930400-1530695631723)]
其中,μ是x的均值,σ是x的方差。因为计算平均值的时候,中心点就是原点,所以μ等于0。
[图片上传失败...(image-b4ad84-1530695631723)]
根据一维高斯函数,可以推导得到二维高斯函数:
[图片上传失败...(image-24fac0-1530695631723)]
有了这个函数 ,就可以计算每个点的权重了。
四、权重矩阵
假定中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:
更远的点以此类推。
为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。
五、计算高斯模糊
有了权重矩阵,就可以计算高斯模糊的值了。
假设现有9个像素点,灰度值(0-255)如下:
每个点乘以自己的权重值:
得到
将这9个值加起来,就是中心点的高斯模糊的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
六、边界点的处理
如果一个点处于边界,周边没有足够的点,怎么办?
一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。
七、参考文献
clear
close all
%%%%%%%%%%%%%%%%%%%%%%%%%生成实验数据集
rand('state',0)
sigma_matrix1=eye(2);
sigma_matrix2=50*eye(2);
u1=[0,0];
u2=[30,30];
m1=100;
m2=300;%样本数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1数据集
Y1=multivrandn(u1,m1,sigma_matrix1);
Y2=multivrandn(u2,m2,sigma_matrix2);
scatter(Y1(:,1),Y1(:,2),'bo')
hold on
scatter(Y2(:,1),Y2(:,2),'r*')
title('SM1数据集')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2数据集
u11=[0,0];
u22=[5,5];
u33=[10,10];
u44=[15,15];
m=600;
sigma_matrix3=2*eye(2);
Y11=multivrandn(u11,m,sigma_matrix3);
Y22=multivrandn(u22,m,sigma_matrix3);
Y33=multivrandn(u33,m,sigma_matrix3);
Y44=multivrandn(u44,m,sigma_matrix3);
figure(2)
scatter(Y11(:,1),Y11(:,2),'bo')
hold on
scatter(Y22(:,1),Y22(:,2),'r*')
scatter(Y33(:,1),Y33(:,2),'go')
scatter(Y44(:,1),Y44(:,2),'c*')
title('SM2数据集')
end
function Y = multivrandn(u,m,sigma_matrix)
%%生成指定均值和协方差矩阵的高斯数据
n=length(u);
c = chol(sigma_matrix);
X=randn(m,n);
Y=X*c+ones(m,1)*u;
end