高斯模糊

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

    高斯模糊(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 技术具有卓越的通用性、高效性、平台移植性和安全性。

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

相关帖子

1 回帖

欢迎来到这里!

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

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

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

推荐标签 标签

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1432 引用 • 10052 回帖 • 490 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 14 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    22 引用 • 70 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 243 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 626 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 10 关注
  • Dubbo

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

    60 引用 • 82 回帖 • 609 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 124 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 389 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    399 引用 • 1246 回帖 • 594 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 651 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 200 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    207 引用 • 358 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    263 引用 • 664 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 4 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 662 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 722 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 515 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    54 引用 • 85 回帖 • 4 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7479 引用 • 34009 回帖 • 197 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 4 关注