图像编程学习笔记9——图像的锐化
2014-04-30 18:59
295 查看
锐化(sharpening)和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波(high passfilter)。锐化处理在增强图象边缘的同时增加了图象的噪声。
常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕。
(3.4)
容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别;再将这个差别加上自身作为新象素的灰度。可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是这个亮点变得更亮,增加了图象的噪声。
因为图象中的边缘就是那些灰度发生跳变的区域,所以锐化模板在边缘检测中很有用,这一点将在后面详细介绍。
功能实现code:
[cpp] view plaincopy
/**
* 函数名: sharpening
* 功 能: 对图像进行锐化处理
*/
void Laplacian()
{
int temp[9] = {-1,-1,-1,-1,9,-1,-1,-1,-1}; //Laplacian 模版
int height = bmpInfoHeader.biHeight;
int width = bmpInfoHeader.biWidth;
int imgSize = bmpInfoHeader.biSizeImage;
int lineByte = (width * 8 +31) / 32 * 4; //每行像素所占字节数
//处理是基于原图的,所以原图的数据不能改变,用pNewBmpData存储改变之后的数据
memcpy(pNewBmpData,pBmpData,imgSize); //把原图数据复制给pNewBmpData
//注意边界点不处理,所以i从1到高度-2,j类似
double temResult; //中间结果
for(int i = 1; i < height - 1; i++ )
{
for(int j = 1; j < width - 1; j++ )
{
temResult = (double)(*(pBmpData + (i-1) * lineByte + j - 1) * temp[0]);
temResult += (double)(*(pBmpData + (i-1) * lineByte + j) * temp[1]);
temResult += (double)(*(pBmpData + (i-1) * lineByte + j + 1) * temp[2]);
temResult += (double)(*(pBmpData + (i) * lineByte + j - 1) * temp[3]);
temResult += (double)(*(pBmpData + (i) * lineByte + j) * temp[4]);
temResult += (double)(*(pBmpData + (i) * lineByte + j + 1) * temp[5]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j - 1) * temp[6]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j) * temp[7]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j + 1) * temp[8]);
*(pNewBmpData + i * lineByte + j) = temResult;
}
}
}
常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕。
(3.4)
容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别;再将这个差别加上自身作为新象素的灰度。可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是这个亮点变得更亮,增加了图象的噪声。
因为图象中的边缘就是那些灰度发生跳变的区域,所以锐化模板在边缘检测中很有用,这一点将在后面详细介绍。
功能实现code:
[cpp] view plaincopy
/**
* 函数名: sharpening
* 功 能: 对图像进行锐化处理
*/
void Laplacian()
{
int temp[9] = {-1,-1,-1,-1,9,-1,-1,-1,-1}; //Laplacian 模版
int height = bmpInfoHeader.biHeight;
int width = bmpInfoHeader.biWidth;
int imgSize = bmpInfoHeader.biSizeImage;
int lineByte = (width * 8 +31) / 32 * 4; //每行像素所占字节数
//处理是基于原图的,所以原图的数据不能改变,用pNewBmpData存储改变之后的数据
memcpy(pNewBmpData,pBmpData,imgSize); //把原图数据复制给pNewBmpData
//注意边界点不处理,所以i从1到高度-2,j类似
double temResult; //中间结果
for(int i = 1; i < height - 1; i++ )
{
for(int j = 1; j < width - 1; j++ )
{
temResult = (double)(*(pBmpData + (i-1) * lineByte + j - 1) * temp[0]);
temResult += (double)(*(pBmpData + (i-1) * lineByte + j) * temp[1]);
temResult += (double)(*(pBmpData + (i-1) * lineByte + j + 1) * temp[2]);
temResult += (double)(*(pBmpData + (i) * lineByte + j - 1) * temp[3]);
temResult += (double)(*(pBmpData + (i) * lineByte + j) * temp[4]);
temResult += (double)(*(pBmpData + (i) * lineByte + j + 1) * temp[5]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j - 1) * temp[6]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j) * temp[7]);
temResult += (double)(*(pBmpData + (i+1) * lineByte + j + 1) * temp[8]);
*(pNewBmpData + i * lineByte + j) = temResult;
}
}
}
相关文章推荐
- 图像编程学习笔记9——图像的锐化
- 图像编程学习笔记3——图像旋转
- 图像编程学习笔记8——图像的平滑(去噪)
- 图像编程学习笔记4——24位真彩色转换为灰度图像
- 图像编程学习笔记5——图像镜像
- 图像编程学习笔记6——图像转置
- opencv学习笔记(3) 锐化图像 邻域操作 ROI
- 【OpenCV学习笔记】【编程实例】三(将一个图像中的指定区域拷贝到另一个图像的指定区域
- 图像编程学习笔记7——图像缩放
- 图像编程学习笔记3——图像旋转
- 图像编程学习笔记6——图像转置
- 图像编程学习笔记2——bmp位图平移
- 图像编程学习笔记8——图像的平滑(去噪)
- 图像编程学习笔记1——bmp文件结构处理与显示
- 图像处理 基于Visual C++编程 学习笔记 (2)显示bmp图像
- ASP.NET 3.5核心编程学习笔记(44):HTTP处理程序的编写之从数据库加载图像
- Opencv学习笔记(四)--图像处理平滑,锐化操作
- opencv2学习笔记4-操作图像(图像锐化-拉普拉斯算子)
- 图像处理 基于Visual C++编程 学习笔记 (3)显示灰度图像和二值化图像
- zynq-7000学习笔记(九)——frame buffer图像显示编程