图像预处理第3步:梯度锐化
2016-04-19 15:10
501 查看
图像锐化的主要目的有两个:
一是增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;二是希望经过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,为进一步的图像理解与分析奠定基础。
图像锐化一般有两种方法:一是微分法,二是高通滤波法。高通滤波法的工作原理和低通滤波相似,这里不再赘述。下面主要介绍一下两种常用的微分锐化方法:梯度锐化和拉普拉斯锐化。但由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后图像的信噪比更低。
运行效果:
![](https://images2015.cnblogs.com/blog/684470/201604/684470-20160419150913804-1335404163.png)
![](https://images2015.cnblogs.com/blog/684470/201604/684470-20160419150957195-1235817193.png)
参考资料:
梯度锐化 http://blog.csdn.net/xiaofengsheng/article/details/4777591
一是增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;二是希望经过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,为进一步的图像理解与分析奠定基础。
图像锐化一般有两种方法:一是微分法,二是高通滤波法。高通滤波法的工作原理和低通滤波相似,这里不再赘述。下面主要介绍一下两种常用的微分锐化方法:梯度锐化和拉普拉斯锐化。但由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后图像的信噪比更低。
//图像预处理第3步:梯度锐化 void CChildView::OnImgprcSharp() { GradientSharp(m_hDIB); //在屏幕上显示位图 CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); }
/*********************************************** * * 函数名称: * GradientSharp() * *参数 : * HDIB hDIB -待处理图像的句柄 * * 返回值: * 无 * *功能: * 现图像的梯度锐化 *说明: * 只能对2值图像进行处理,如果图像本身边缘较细,可能造成信息的损失 **********************************************************************/ void GradientSharp(HDIB hDIB) { // 指向DIB的指针 LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB); // 指向DIB象素指针 LPSTR lpDIBBits; // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); //获取图像的宽度 LONG lWidth=::DIBWidth ((char*)lpDIB); //获取图像的长度 LONG lHeight=::DIBHeight ((char*)lpDIB); // 阈值 BYTE bThre = 2; // 调用GradSharp()函数进行梯度板锐化 // 指向源图像的指针 unsigned char* lpSrc; unsigned char* lpSrc1; unsigned char* lpSrc2; // 循环变量 LONG i; LONG j; // 图像每行的字节数 LONG lLineBytes; // 中间变量 BYTE bTemp; // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 每行 for(i = 0; i < lHeight; i++) { // 每列 for(j = 0; j < lWidth; j++) { // 指向DIB第i行,第j个象素的指针 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 指向DIB第i+1行,第j个象素的指针 lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j; // 指向DIB第i行,第j+1个象素的指针 lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1; //计算梯度值 bTemp = abs((*lpSrc)-(*lpSrc1)) + abs((*lpSrc)-(*lpSrc2)); // 判断是否小于阈值 if (bTemp < 255) { // 判断是否大于阈值,对于小于情况,灰度值不变。 if (bTemp >= bThre) { // 直接赋值为bTemp *lpSrc = bTemp; } } else { // 直接赋值为255 *lpSrc = 255; } } } //最后还要处理一下图像中最下面那行 for(j = 0; j < lWidth; j++) { //指向最下边一行,第j个象素的指针 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 0 + j; //将此位置的象素设置为255,即白点 *lpSrc=255; } //解除锁定 ::GlobalUnlock ((HGLOBAL)hDIB); }
运行效果:
![](https://images2015.cnblogs.com/blog/684470/201604/684470-20160419150913804-1335404163.png)
![](https://images2015.cnblogs.com/blog/684470/201604/684470-20160419150957195-1235817193.png)
参考资料:
梯度锐化 http://blog.csdn.net/xiaofengsheng/article/details/4777591
相关文章推荐
- 宏碁4743G+固态硬盘(SSD)+机械硬盘(HHD)混合用
- 信息流造就阿里 物流造就京东
- Kesci“魔镜杯”风控算法大赛复赛解决方案
- C#-using用法详解
- Java的线程模型
- Java-单机版的书店管理系统(练习设计模块和思想_系列 七 )
- ios开发-- 开发细节(代理传值)
- vim 批量删除注释
- VisualVM 的 OQL 的一些例子
- leetcode第一刷_Unique Binary Search Trees
- Linux设置自启动
- Java-单机版的书店管理系统(练习设计模块和思想_系列 七 )
- linux 终端 常用命令及快捷键
- httpd(apache)程序环境配置文件
- C语言里栈和堆的区别整理
- 剑指Offer--022-栈的压入、弹出序列
- laravel-服务提供者
- 深入理解java的抽象类和接口
- LC_ALL=en_US.UTF-8 让 awk 慢了 40 倍! 【转】
- tableView的优化