文档章节

Unsharp Mask(USM)锐化算法的的原理及其实现。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:39
字数 1415
阅读 4
收藏 0
点赞 0
评论 0

      在开局之前,首先说明一点,Photoshop的USM锐化只是本文所指USM的一种比较特殊的例子而已。

      通过增强图像的高频部分的内容,图像的视觉效果可以极大的得到改观。为达到这个目的,通常可以使用经典USM技术来实现。这个技术的流程可用下图来实现:

                   

      用具体的公式表达即为:

                    y(n,m)= x(n,m)+ λz(n,m)                                                       (1)

      其中, x(n,m)为输入图像,y(n,m)为输出图像,而z(n,m)为校正信号,一般是通过对x进行高通滤波获取。λ是用于控制增强效果的的一个缩放因子。

      在传统的USM算法中,z(n,m)一般可以通过下式获取:

              z(n,m)=4x(n,m)-x(n-1,m) -x(n +1,m)-x(n, m-1) -x(n,m+1)             (2)

      当然也可以用如下的模板:

                     

        贴部分参考代码:

   Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; NewHeight = Height +  2; NewStride = (Width +  2) * BytePerPixel;           ExpandPtr = (byte*)Win32Api.GlobalAlloc(Win32Const.GPTR, NewStride * NewHeight);  // 为保证边缘部分处理方便,扩展边界部分 Utility.GetExpandImage(Bitmap, 1, ExpandPtr);      // 拷贝图像到缓冲区,以及填充边缘像素 for (Y = 0; Y < Height; Y++)                // 处理灰度图像 { Pointer = Bitmap.Pointer + Y * Stride; ExpandP = ExpandPtr + (Y+1) * NewStride+1; for (X = 0; X < Width; X++) { HighPass = (ExpandP[X] << 2) - ExpandP[X - 1] - ExpandP[X + 1] - ExpandP[X - NewStride] - ExpandP[X + NewStride]; // z(n,m) Value = Pointer[X] + Amount * HighPass / 100; // x(n,m)+ λz(n,m),式中的Amount即这里的λ Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15)); // 防止数据溢出 } }
Win32Api.GlobalFree((IntPtr)ExpandPtr);

  在很多场合,这个方法也能获得较好的效果,比如下述的Lena图。

            

                   原图                   Amount=25                                    Amount=100

      不过这个方面也有以下的缺点: 1) 线性的高通滤波使得效果对噪音非常敏感,这会导致一些不希望的扭曲,特别在图像变换比较缓慢的地方的噪音,比如上图3中草帽的左侧平坦区域。2)对于图像的边缘(高对比度区域)会出现增强过头的现象,如上图草帽的边缘。  这两点会导致输出图像存在一些令人看上去不舒服的地方。
     很多论文中提出了一些自适应通过动态的改变式(1)中的λ参数来控制调节结果。在图像的变换比较平坦的区域,λ取值小,在较大的对比度(边缘处)地方取适当的λ,而在中对比度处取较大的λ值,以使得这部分的得到最大的增强。 比如这篇文章 Image Enhancement via Adaptive Unsharp Masking 中就提出了一种逐步更新的方式。不过类似这样的文章都普遍存在一个问题,那就是可控参数过多,且这些从参数的取值需要过多的人工参与,我认为这样的算法,是不具有实用的价值的。

     在Photoshop的锐化菜单中也有一项USM锐化,其实这个功能也是符合式1的定义的。通过其UI界面我们可以发现其有3个参数:半径、数量、阈值,其内部的算法过程可以用如下的简单代码表示:

Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; BytePerPixel = Bitmap.BitCount / 8;
    FastBitmap Clone = Bitmap.Clone();    // 备份图像数据
    BlurEffect.GaussianBlur(Clone, Radius);  // 对备份的数据进行高斯模糊处理
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Bitmap.Pointer + Y * Stride;
        PointerC = Clone.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Value = Pointer[X] - PointerC[X];
            if (Utility.Abs (Value) > Threshold)
            {
                Value = Pointer[X] + Amount * Value / 100;
                Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15));
            }
        }
    }
    Clone.Dispose();

      众所周知,高斯模糊时低通滤波,那么 Value = Pointer[X] - PointerC[X](原值-低通)则相当于高通的结果,如果原值和低通的差异的绝对值大于指定的阈值,则对改点进行所谓的锐化。

      这里对式(1)多引进了一个参数阈值,通过调节该值,来决定达到何种程度对比度的像素才需要增强。

      实际的效果表明,这种方式的锐化要比传统的USM锐化能获得更好的调节效果。

      以下为Threshold=0,Amount=50时不同半径的效果。

         

       

                    原图                                                                Radius=5                                             Radius=50                                          Radius=200

      随着半径的增大,图像的对比度逐渐变强,边缘越发明显,但是所有的调节后的图像都未出现明显的噪音增强,效果非常之理想,对于Lena图,处理后的图片中可以明显的看出在眼睛部位,眼白和眼球的对比更为清晰、明显,而且整幅图形从感觉上说原始图像较为朦胧,处理后的清晰不少。

      Amount参数对效果的影响很明显可以获知,越大,对比度越高,但是由于其和结果的线性关系,这个参数的变化对结果的影响比其他两个参数更敏感。

      实际上,上述高斯模糊也可以用中值模糊、方框模糊来代替,所得到的效果和高斯滤波非常相似。在Paint.net的效果-》相片-》尖锐化滤镜就是用的中值的方式实现的。

    关于实现代码,基本上我在上面已经提及,其实最关键还是高斯模糊的实现。如果你觉得有难度,正如上文所说,也可以用均值来代替,而均值模糊编码则非常简单。 

 

    同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:

    http://files.cnblogs.com/Imageshop/USM.rar

 

 

 ***************************作者: laviewpbt   时间: 2013.5.19    联系QQ:  33184777  转载请保留本行信息*************************

 

 

本文转载自:http://www.cnblogs.com/Imageshop/archive/2013/05/19/3086388.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
FPGA设计——图像处理(锐化增强)

1. 概述 本设计采用FPGA技术,实现CMOS视频图像的锐化增强,并通过以太网传输(UDP方式)给PC实时显示。 2. 硬件系统框图 CMOS采用MT9V011(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网...

shugenyin
2017/10/28
0
0
PNG尺寸缩小实战

为了节省资源,我们希望在不同分辨率的前端上可以获取到不同尺寸的素材资源。由于最近的业务中使用的所有素材都是PNG格式的图片,并且对图片效果要求比较严格,并没有在市面上找到可以直接使...

EchoZhou
2017/11/29
0
0
android图片特效处理之锐化效果

这篇将讲到图片特效处理的锐化效果。跟前面一样是对像素点进行处理,算法是通用的。 算法原理: 一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像...

迷途d书童
2012/03/05
1K
0
Qt Quick 图像处理实例之美图秀秀(附源码下载)

在《Qt Quick 之 QML 与 C++ 混合编程详解》一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混合编程的威力,同时也为诸君揭...

foruok
2014/07/16
0
0
编译安装SNMP,snmpd.conf配置文件说明

一、编译安装net-snmp tar -xzvf net-snmp-5.4.1.tar.gz//解压cd /net-snmp-5.4.4./configure--prefix=/usr/local/net-snmp --with-default-snmp-version="2"--with-sys-contact="a@b.com"--......

_July_x
2015/10/08
0
0
【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、...

Eastmount
2015/06/08
0
0
海量数据解决思路之BitMap

一、概述 本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景的使用...

zengzhaozheng
07/02
0
0
介绍一些Java图像处理的常用算法实现包

Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如剪切、缩放、反转色、扭曲、水波纹、凹凸、黑白效果等等数十种效果。 该项目最大的问...

红薯
2010/04/26
5.9K
2
图片滤镜算法原理简单讲解

一、锐化   锐化的算法很简单,就是比较相邻的几个像素,把当前像素加上和周围的像素的差就可以了。这里我给出一个示例: A B C D E F G H I J K L M N O P   假设有一个图片,4*4,共1...

付翔
2010/08/21
0
0
图像的空域增强处理—空域滤波(matlab实现)

在这里我描述的是我一个初学者所收集到的一些较实用化的信息,具体原理不做描述; 空域滤波分为:平滑滤波(低通滤波)、锐化滤波(高通滤波); 平滑滤波(低通滤波):过滤掉图像中的高频部...

qwe331822775
03/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring配置xml启动报错 Connot find 'beans'

1.我们先看一下spring的原始配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc......

江湖鱼大虾
6分钟前
0
0
与女儿谈商业模式 (4):戴尔的成功秘诀

分类:与女儿谈商业模式 | 标签: 戴尔 经济学 陈志武 2007-05-15 10:26阅读(7434)评论(36)   2007年5月《创富志》与“女儿谈商业模式”专栏 (之四)   戴尔的成功秘诀   陈志武   ...

祖冲之
15分钟前
0
0
www.w3.org被qiang导致logback报错:Connect reset

web项目部署到tomcat后,web项目中的logback不能运行,报错信息如下: Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file......

浮躁的码农
29分钟前
0
0
JDeveloper中文乱码解决

全局设置字体; 全局设置环境编码; 项目设置编译器环境编码。

wffger
57分钟前
2
0
MySQL主从介绍 , 准备工作,配置主,配置从, 测试主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

TaoXu
今天
2
0
线性代数学习总结

亭子happy
今天
1
0
Java8:Lambda表达式增强版Comparator和排序

1、概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是...

孟飞阳
今天
0
0
从架构到组件,深挖istio如何连接、管理和保护微服务2.0?

近几年我一直从事于微服务系统的设计以及实现方面的工作,属于微服务架构一线实践者。之前做过一些单体系统的微服务改造,在微服务拆分、治理等方面都有一定的经验。 本人比较特殊一点的经历...

xiaomin0322
今天
1
0
基于vue的h5文件切片上传(获取文件md5,实现秒传、进度条实现)

template <button @click="file"></button><label ref="upload" style="position: relative;"> <input type="file" @change="selectFile" style="position: abs......

hkaikai
今天
2
0
Spring Boot 2.0 项目实现自同步AD域账号

在通过Spring Boot的自动化装配功能及JDK自带的LDAP模块,可通过如下几个简单步骤实现业务系统自动同步AD域账号功能。 1. Java自带ldap搜索域账号信息核心代码: try { LdapContext ctx...

B超
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部