高斯模糊

本贴最后更新于 4702 天前,其中的信息可能已经事过境迁

    高斯模糊(Gausscian Blur,亦称高斯平滑)是一种基于二维正态分布的的加权模糊,用于图像去噪及弱化图像细节,相比平均模糊暴力地将周围像素平等对待,高斯模糊利用正态分布函数对周围像素进行评价,距离中心点较远的像素对中心点影响较小。高斯模糊是一种低通滤波器。(参考维基百科。)


    一、卷积运算

    图像的卷积运算是特殊的领域运算,从某个像素点开始依次向后运算,比较像卷起地毯的动作。

    模板:参与运算的矩阵,以此矩阵对目标图像进行处理。

    核(kernel):基数正方形矩阵,是一个权矩阵。

    卷积运算:权矩阵在目标图像上的加权运算。


    二、高斯函数

    N维正态分布:

     photo bb5c0a46b9073d8ce8f6ce864060f0f0_zps68811b4e.png

   N=2时,二维正态分布如下:

     photo 40ee9ba7b3d7647a9fe9419f5edb1db7_zpsc4b30ba2.png

    其中u、v的取值范围为[-r,r],r为模糊半径。根据公式可计算出kernel,即卷积模板。

    此时得到的矩阵需要进行归一化处理,使模板的总和基本等于1。归一化方法很简单,直接计算矩阵内所有元素总和,再分别将各个元素除以此总和即可。

    

// G(x,y)=[1/(2*PI*sigma^2)]*e^[-((x^2+y^2)/(2*sigma^2))]
	// x,y->[-radius,radius)
	public float[][] gaussian2DKernel(final int radius, final float sigma) {
		final int length = 2 * radius;
		final float[][] matric = new float[length + 1][length + 1];
		final float sigmaSquare2 = 2 * sigma * sigma;
		float sum = 0;
		for (int x = -radius; x <= radius; x++) {
			for (int y = -radius; y <= radius; y++) {
				matric[radius + x][radius + y] = (float) (Math.pow(Math.E, -(x
						* x + y * y)
						/ sigmaSquare2) / (Math.PI * sigmaSquare2));
				sum += matric[radius + x][radius + y];
			}
		}
		for (int x = 0; x < length; x++) {
			for (int y = 0; y < length; y++) {
				matric[x][y] /= sum;
			}
		}
		return matric;
	}


   当r=3,sigma=0.84089642时,模板如下:

0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117
0.00038771 0.01330373 0.11098164 0.22508352 0.11098164 0.01330373 0.00038771
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292
0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067
    (数据来源于维基百科,可用于检验算法的正确性。)


    卷积运算Java代码:


	public BufferedImage convolution(final BufferedImage image,
			final float kernel[][]) {
		final int width = image.getWidth();
		final int height = image.getHeight();
		final int radius = kernel.length / 2;
		final BufferedImage retImage = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_ARGB);
		for (int i = 0; i < width; i++) {
			for (int j = 0; j < height; j++) {
				double sumA = 0;
				double sumR = 0;
				double sumG = 0;
				double sumB = 0;
				for (int x = i - radius; x <= i + radius; x++) {
					for (int y = j - radius; y <= j + radius; y++) {
						final int posX = x < 0 ? 0 : x >= width ? width - 1 : x;
						final int posY = y < 0 ? 0 : y >= height ? height - 1
								: y;
						final int color = image.getRGB(posX, posY);
						final int a = (color >> 24) & 0xff;
						final int r = (color >> 16) & 0xff;
						final int g = (color >> 8) & 0xff;
						final int b = color & 0xff;
					final int kelX=x - i + radius;
					final int kelY=y - j + radius;
					sumA += kernel[kelX][kelY] * a;
					sumR += kernel[kelX][kelY] * r;
					sumG += kernel[kelX][kelY] * g;
					sumB += kernel[kelX][kelY] * b;
				}
			}
			final int blurColor = (((int) sumA)&lt;&lt;24)
					| (((int) sumR) &lt;&lt; 16) | (((int) sumG) &lt;&lt; 8) | ((int) sumB);
			retImage.setRGB(i, j, blurColor);
		}
	}
	return retImage;
}</pre> 


   值得注意的是,各个颜色通道必须分别处理。


   原图:

    photo 9755c44c4c3511162cbeac2393dd1a7e_zps2cf32894.jpg

   效果图:

    photo gaussian_zpseeb969c9.png

   边缘处理:矩阵卷积运算必然涉及边缘像素处理问题。在对边缘像素加权求和时,模板覆盖到边界之外,实际应用最多的有三种方法:1)舍弃这些像素,即生成图片减少一圈宽为radius(模糊半径)的边框;2)原封不动地保留这些像素,即生成图片有一圈宽为radius(模糊半径)的边框;3)使用最近的像素或者另一边的像素填充使其满足运算条件。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3206 引用 • 8217 回帖
  • 卷积
    1 引用 • 1 回帖
  • 图像处理
    10 引用 • 9 回帖
  • 高斯平滑
    1 引用 • 1 回帖 • 1 关注
  • 高斯分布
    1 引用 • 1 回帖
  • 正态分布
    1 引用 • 1 回帖
  • 高斯模糊
    2 引用 • 1 回帖

相关帖子

1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    此处边缘处理采用临近像素法。

推荐标签 标签

  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 403 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖 • 2 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    14 引用 • 84 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    308 引用 • 773 回帖
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    174 引用 • 414 回帖 • 344 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 350 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 458 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 636 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 847 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 724 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 702 关注
  • 分享

    有什么新发现就分享给大家吧!

    251 引用 • 1801 回帖 • 1 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    34 引用 • 333 回帖 • 1 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 565 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    110 引用 • 153 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 429 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    6 引用 • 35 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注