图像编程学习笔记9——图像的锐化

锐化(sharpening)和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波(high
passfilter)。锐化处理在增强图象边缘的同时增加了图象的噪声。

常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕。

(3.4)

容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别;再将这个差别加上自身作为新象素的灰度。可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是这个亮点变得更亮,增加了图象的噪声。

因为图象中的边缘就是那些灰度发生跳变的区域,所以锐化模板在边缘检测中很有用,这一点将在后面详细介绍。

功能实现code:

[cpp] view plaincopy

  1. /**

  2. * 函数名: sharpening

  3. * 功  能: 对图像进行锐化处理

  4. */

  5. void Laplacian()

  6. {

  7. int temp[9] = {-1,-1,-1,-1,9,-1,-1,-1,-1};   //Laplacian 模版

  8. int height = bmpInfoHeader.biHeight;

  9. int width = bmpInfoHeader.biWidth;

  10. int imgSize = bmpInfoHeader.biSizeImage;

  11. int lineByte = (width * 8 +31) / 32 * 4;  //每行像素所占字节数

  12. //处理是基于原图的,所以原图的数据不能改变,用pNewBmpData存储改变之后的数据

  13. memcpy(pNewBmpData,pBmpData,imgSize);   //把原图数据复制给pNewBmpData

  14. //注意边界点不处理,所以i从1到高度-2,j类似

  15. double temResult;  //中间结果

  16. for(int i = 1; i < height - 1; i++ )

  17. {

  18. for(int j = 1; j < width - 1; j++ )

  19. {

  20. temResult = (double)(*(pBmpData + (i-1) * lineByte + j - 1) * temp[0]);

  21. temResult += (double)(*(pBmpData + (i-1) * lineByte + j) * temp[1]);

  22. temResult += (double)(*(pBmpData + (i-1) * lineByte + j + 1) * temp[2]);

  23. temResult += (double)(*(pBmpData + (i) * lineByte + j - 1) * temp[3]);

  24. temResult += (double)(*(pBmpData + (i) * lineByte + j) * temp[4]);

  25. temResult += (double)(*(pBmpData + (i) * lineByte + j + 1) * temp[5]);

  26. temResult += (double)(*(pBmpData + (i+1) * lineByte + j - 1) * temp[6]);

  27. temResult += (double)(*(pBmpData + (i+1) * lineByte + j) * temp[7]);

  28. temResult += (double)(*(pBmpData + (i+1) * lineByte + j + 1) * temp[8]);

  29. *(pNewBmpData + i * lineByte + j) = temResult;

  30. }

  31. }

  32. }

图像编程学习笔记9——图像的锐化,码迷,mamicode.com

时间: 2024-10-14 06:29:48

图像编程学习笔记9——图像的锐化的相关文章

图像编程学习笔记6——图像转置

转置(transpose)是指将x,y坐标对换,图2.2的转置如图2.15所示. 图2.2 图2.15   图2.2的转置 要注意的是,转置和旋转900是有区别的,不信你可以试试:怎么旋转,图2.2也转不出图2.15来.另外,转置后图的宽高对换了.转置的变换矩阵很简单: (2.12) 镜象变换的源代码如下,因为和旋转的那段程序很类似,程序中的注释就简单一些: 由于很多代码和之前的重复,所以只给出主要功能代码(win32 控制台程序) [cpp] view plaincopy void trans

图像编程学习笔记5——图像镜像

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 镜象(mirror)分水平镜象和垂直镜象两种.图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示 图2.13   图2.2的水平镜象 图2.14   图2.2的垂直镜象 镜象的变换矩阵很简单.设原图宽为w,高为h,变换后,图的宽和高不变. 水平镜象的变化矩阵为: (2.10) 垂直镜象的变化矩阵为: (2.11) 镜象变换的源代码如下,因为和平移的那段程序很类似,程序中的注释

图像编程学习笔记7——图像缩放

假设放大因子为ratio,(为了避免新图过大或过小,我们在程序中限制0.25≤ratio≤4),缩放(zoom)的变换矩阵很简单: (2.13) 缩放变换的源代码如下,因为和转置的那段程序很类似,程序中的注释就简单一些. [cpp] view plaincopy /** * 函数名: zoom * 参  数: ratio -- 缩放率 * 功  能: 对图片进行水平和垂直镜像操作 *         只保存原图大小的图像数据,如果没有就用白色填充 */ void zoom(double rati

图像编程学习笔记8——图像的平滑(去噪)

第一种方法:高斯模版 以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 先举个例子说明一下什么是平滑(smoothing),如下面两幅图所示:可以看到,图3.2比图3.1柔和一些(也模糊一些).是不是觉得很神奇?其实实现起来很简单.我们将原图中的每一点的灰度和它周围八个点的灰度相加,然后除以9,作为新图中对应点的灰度,就能实现上面的效果. 这么做并非瞎蒙,而是有其道理的.大概想一想,也很容易明白.举个例子,就象和面一样,先在中间加点水

OpenCV2学习笔记:图像的读取与显示

1. 图像读取:imread() Mat imread(const string& ?lename, int ?ags=1 ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取值可以有: -- CV_LOAD_IMAGE_ANYDEPTH : 如果设置这个标志的话,如果图像为16位或32位深度的图像,则返回对应深度的图像:否则,将图像转换为8位深度图像再返回. -- CV_LOAD_IMAGE_COLOR

Java并发编程学习笔记

Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

JAVA GUI编程学习笔记目录

1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之GUI编程窗体事件 6.JAVA之GUI编程Action事件 7.JAVA之GUI编程鼠标事件 8.JAVA之GUI编程键盘码查询器 9.JAVA之GUI编程列出指定目录内容 10.JAVA之GUI编程弹出对话框Dialog 11.JAVA之GUI编程菜单 12.JAVA之GUI编程打开与保存文件 13.JAVA之GUI编程将程序打包jar JA