高斯模糊

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

    高斯模糊(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

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

推荐标签 标签

  • SQLServer

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

    19 引用 • 31 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 209 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    89 引用 • 897 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 535 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 635 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 3 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 666 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • Ngui

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

    7 引用 • 9 回帖 • 376 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    149 引用 • 3772 回帖
  • 互联网

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

    98 引用 • 344 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    29 引用 • 111 回帖
  • abitmean

    有点意思就行了

    36 关注
  • SSL

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

    70 引用 • 193 回帖 • 447 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 130 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖 • 1 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 以太坊

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

    34 引用 • 367 回帖 • 5 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 196 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 9 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 349 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖