图像锐化

图像锐化处理的目的是使模糊的图像变得更加清晰起来,通常针对引起图像模糊的原因而进行相应地锐化操作属于图像复原的内容。图像的模糊实质就是图像受到平均或积分运算造成的,因此可以对图像进行还原运算如微分运算来使图像清晰化。从频谱角度来分析,图像模糊的实质是其高频分量被衰减,因而可以通过高通滤波操作来清晰图像。但要注意,能够进行锐化处理的图像必须有较高的信噪比,否则锐化后图像信噪比反而更低,从而使噪声的增加得比信号还要多,因此一般是先取出或减轻噪声后再进行锐化处理。下面对图像锐化的集中算子进行学习。

1.拉普拉斯算子(Laplacian)

拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
一个连续的二元函数f(x,y),其拉普拉斯运算定义为:

对于数字图像,拉普拉斯算子可以简化为:

也可以按卷积形式表示:

其中K=1,I=1时H(r,s)取下式,四方面模板:

通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积的负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。

代码如下:

//拉普拉斯算子
void LaplacianFilter(BYTE *SrcImage, BYTE *DstImage, int nWidth, int nHeight)
{int HWS=3;//模板维数:此四个模板均为3维的int H[3][3]={{0,-1,0},//模板是个中心为4的拉普拉斯算子{-1,4,-1},{0,-1,0}};int red, green, blue;int X,Y;//一维坐标转换为二维坐标int TR, TG, TB;//记录红绿蓝坐标位置//图像增强 锐化for (int i=0;i<nWidth*nHeight;i=i+3){X=(i/3)%nWidth;//x列Y=(i/3)/nHeight;//y行red=green=blue=0;//对图像进行像素求和并取平均值HWS维数for (int j=Y-HWS/2; j<Y+HWS/2+1 ; j++)//第j行{for (int k=X-HWS/2 ; k<X+HWS/2+1 ; k++)//第k列{if (j>=0 && k>=0 && k<nWidth && j<nHeight){TR = j*nWidth*3+k*3;red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TR]);TG = j*nWidth*3+k*3+1;green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TG]);TB = j*nWidth*3+k*3+2;blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TB]);}}}//对新图像进行赋值if (red>=0 && red<256){DstImage[i]=red;}else if (red < 0){DstImage[i]=0;}else DstImage[i]=0;if (green>=0 && green<256){DstImage[i+1]=green;}else if (green<0){DstImage[i+1]=0;}else DstImage[i+1]=0;if (blue>=0 && blue<256){DstImage[i+2]=blue;}else if (blue<0){DstImage[i+2]=0;}else DstImage[i+2]=0;}
}

结果如下;

2.高通滤波

常用的高通模板如下所示,其中H2有的书上又称为拉普拉斯八方向的锐化模板。



选取H2模板,代码如下所示:

//高通滤波
void HighpassFilter(BYTE *SrcImage, BYTE *DstImage, int nWidth, int nHeight)
{int HWS = 3;int H[3][3]={{-1,-1,-1},{-1,8,-1},{-1,-1,-1}};int red, green, blue;int X,Y;int TR,TG,TB;//图像增强 锐化for (int i=0; i<nWidth*nHeight; i=i+3){X=(i/3)%nWidth;Y=(i/3)/nHeight;red=green=blue=0;//对图像进行像素求和并取平均值 HWS维数for (int j=Y-HWS/2;j<Y+HWS/2+1;j++){for (int k=X-HWS/2;k<X+HWS/2+1;k++){if (j>=0 && k>=0 && k<nWidth && j<nHeight){TR = j*nWidth*3+k*3;red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TR]);TG = j*nWidth*3+k*3+1;green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TG]);TB = j*nWidth*3+k*3;blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TB]);}}}//对新图像赋值if (red>=0 && red<256){DstImage[i]=red;}else if (red<0){DstImage[i]=0;}else DstImage[i]=0;if (green>=0 && green<256){DstImage[i+1]=green;}else if (green<0){DstImage[i+1]=0;}else DstImage[i+1]=0;if (blue>=0 && blue<256){DstImage[i+2]=blue;}else if (blue<0){DstImage[i+2]=0;}else DstImage[i+2]=0;}
}

结果如下:

3.Sobel算子




模板表示如下:


需要注意X和Y两个方向的模板处理,代码如下所示:

//Sobel算子
void SobelFilter(BYTE *SrcImage, BYTE *DstImage, int nWidth , int nHeight)
{int HWS=3;//Sobel算子模板int HX[3][3]={{1,0,-1},{2,0,-2},{1,0,-1}};int HY[3][3]={{-1,-2,-1},{0,0,0},{1,2,1}};int redX,greenX,blueX;int redY,greenY,blueY;int X,Y;int TR, TG, TB;//图像增强 锐化for (int i=0;i<nWidth*nHeight;i=i+3){X=(i/3)%nWidth;Y=(i/3)/nHeight;redX=greenX=blueX=0;redY=greenY=blueY=0;//对图像进行像素求和并取平均值 HWS维数for (int j=Y-HWS/2; j<Y+HWS/2+1; j++){for (int k=X-HWS/2; k<X+HWS/2+1;k++){if (j>=0 && k>=0 && k<nWidth && j<nHeight){TR = j*nWidth*3+k*3;redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TR]);redY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TR]);TG = j*nWidth*3+k*3+1;greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TG]);greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TG]);TB = j*nWidth*3+k*3+2;blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TB]);blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TB]);}}}int R,G,B;R= (int)(sqrt(redX*redX*1.0+redY*redY*1.0));G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));if (redX<0 && redY<0){DstImage[i]=0;}else if (R>255){DstImage[i]=255;}else DstImage[i]=R;if (greenX<0 && greenY<0){DstImage[i+1]=0;}else if (G>255){DstImage[i+1]=255;}else DstImage[i+1]=G;if (blueX<0 && blueY<0 ){DstImage[i+2]=0;}else if (B>255){DstImage[i+2]=255;}else DstImage[i+2]=B;}
}

结果如下:

4.Isotropic算子


模板如下所示:


代码如下:

//Isotropic算子
void IsotropicFilter(BYTE *SrcImage, BYTE *DstImage, int nWidth, int nHeight)
{int HWS=3;//Isotropic算子float HX[3][3]={{1,0,-1},{sqrt(2.0),0,-sqrt(2.0)},{1,0,-1}};float HY[3][3]={{-1,-sqrt(2.0),-1},{0,0,0},{1,sqrt(2.0),1}};float redX,greenX,blueX;float redY,greenY,blueY;int X,Y;int TR, TG, TB;//图像增强for (int i=0;i<nWidth*nHeight; i=i+3){X=(i/3)%nWidth;Y=(i/3)/nHeight;redX = greenX = blueX =0;redY = greenY = blueY =0;//对图像进行像素求和并取均值HWS维数for (int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++){for (int k=X-HWS/2 ; k<X+HWS/2+1 ; k++){if (j>=0 && k>=0 && k<nWidth && j<nHeight){TR = j*nWidth*3+k*3;redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TR]);redY+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TR]);TG = j*nWidth*3+k*3+1;greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TG]);greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TG]);TB = j*nWidth*3+k*3+2;blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TB]);blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(SrcImage[TB]);}}}int R,G,B;R= (int)(sqrt(redX*redX*1.0+redY*redY*1.0));G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));if (redX<0 && redY<0){DstImage[i]=0;}else if (R>255){DstImage[i]=255;}else DstImage[i]=R;if (greenX<0 && greenY<0){DstImage[i+1]=0;}else if (G>255){DstImage[i+1]=255;}else DstImage[i+1]=G;if (blueX<0 && blueY<0 ){DstImage[i+2]=0;}else if (B>255){DstImage[i+2]=255;}else DstImage[i+2]=B;}
}

结果如下:

运行结果与Sobel算子的结果相似。

5.Prewitt算子


模板如下:


代码如下:

//Prewitt算子
void PrewittFilter(BYTE *SrcImage, BYTE *DstImage, int nWidth, int nHeight)
{int HWS=3;int H[3][3]={{1,0,-1},{1,0,-1},{1,0,-1}};//模板为prewitt算子int red, green, blue;int X,Y;int TR, TG, TB;//图像增强for (int  i=0; i<nWidth*nHeight;i=i+3){X=(i/3)%nWidth;Y=(i/3)/nHeight;red=green=blue=0;//对图像进行像素求和并取平均值HWS维数for (int j=Y-HWS/2;j<Y+HWS/2+1;j++){for (int k=X-HWS/2; k<X+HWS/2+1;k++){if (j>=0 && k>=0 && k<nWidth && j<nHeight){TR= j*nWidth*3+k*3;red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TR]);TG=j*nWidth*3+k*3+1;green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TG]);TB=j*nWidth*3+k*3+2;blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(SrcImage[TB]);}}}//对新图像赋值if (red>=0 && red<256){DstImage[i]=red;}else if (red<0){DstImage[i]=0;}else DstImage[i]=0;if (green>=0 && green<256){DstImage[i+1]=green;}else if (green<0){DstImage[i+1]=0;}else DstImage[i+1]=0;if (blue>=0 && blue<256){DstImage[i+2]=blue;}else if (blue<0){DstImage[i+2]=0;}else DstImage[i+2]=0;}
}

结果如下:

通过对各种图像锐化算子的学习发现,其之间的区别就在与卷积核的不同。

【数字图像处理】图像锐化:拉普拉斯算子(Laplacian)、高通滤波、Sobel算子、Isotropic算子、Prewitt算子相关推荐

  1. matlab与数字图像处理--图像锐化imsharpen

    在对图像进行锐化时,图像灰度变化之处将引入一段"过冲",和人眼视觉中的马赫带效应相同.可以理解图像锐化即是增强了人眼的马赫带效应. mat=zeros(300,500); mat( ...

  2. 数字图像处理课设图像的锐化_数字图像处理图像锐化处理.ppt

    数字图像处理图像锐化处理 4.7.2 灰度级到彩色转换 灰度级到彩色转换(例) 在HSI彩色空间的直方图均衡强度均衡处理没有改变图像的色调和饱和度值,但它的确影响了整体图像的彩色感观. 向量分量可以用 ...

  3. 数字图像处理 - Ch3 锐化(高通)空间滤波器

    数字图像处理 Ch3 锐化(高通)空间滤波器 锐化(高通)空间滤波器 1. 一阶导数和二阶导数 2. 利用二阶导数锐化图像 -- 拉普拉斯 3. 钝化掩蔽和高提升滤波 4. 使用一阶导数锐化图像 -- ...

  4. 计算机图像进行滤波的函数,数字图像处理图像滤波.ppt

    数字图像处理图像滤波 图像滤波 图像处理中所用到的图像往往含有噪声,需要用图像滤波的方法去除噪声. 内容框架 像素基础知识介绍 算术和逻辑运算 直方图 直方图均衡算法,用于图像锐化. 图像增强基本方法 ...

  5. 数字图像处理图像反转的实现_使用8086微处理器反转16位数字

    数字图像处理图像反转的实现 Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to ...

  6. 数字图像处理图像反转的实现_反转8位数字| 8085微处理器

    数字图像处理图像反转的实现 Problem statement: 问题陈述: To reverse 8 bits number using 8085 microprocessors. 使用8085微处 ...

  7. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  8. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  9. java 拉普拉斯_opencv3_java 图形图像的拉普拉斯平滑Laplacian Laplacian

    图形图像的拉普拉斯平滑Laplacian Laplacian package opencv_java_demo; import org.opencv.core.*; import org.opencv ...

  10. 《opencv 数字图像处理 图像基础》

    <opencv 数字图像处理 图像基础> 矩阵 通道分离和合并 彩色图像转灰度图像 灰度图转二值化图像 图像运算 矩阵 定义一个显示图像的函数,对于灰度图,里面添加了vmin=0,vmax ...

最新文章

  1. Big Data Security Part One: Introducing PacketPig
  2. 【问题解决】连接mysql 8错误:authentication plugin 'caching_sha2_password
  3. RTX 30系游戏本来了!1月26日开售,售价999美元起
  4. c++ 原子操作 赋值_原子操作原理
  5. PL/SQL Developer的错误提示弹框的文本显示乱码问题
  6. python watchdog的使用_python watchdog监控文件修改
  7. Java中Lambda表达式的使用(转)
  8. 帆软报表插件开发系列之plugin.xml
  9. 读取FTP上的excel文件,并写入数据库
  10. 验1-8 输出倒三角图案 (5 分)
  11. 从头到尾谈一下HTTPS
  12. ug打开服务器文件保存不了,UG突然说保存不了, 你都是怎么处理的呢?
  13. 基于NB-IOT的智能烟感应用方案
  14. SCI顶级牛刊《Nature》合集PDF(2018~2020年度)
  15. GFlags使用文档
  16. 计算机丢失bass,dll,bassasio.dll(缺失bassasio.dll文件修复工具)V1.0 正式版
  17. 艺术科技杂志艺术科技杂志社艺术科技编辑部2022年第4期目录
  18. 【ES实战】ES上的安全性运行方式
  19. 分层 Wyner-Ziv视频编解码——第二天
  20. 离散数学 用c++实现离散数学逻辑推理

热门文章

  1. 透彻理解BN(Batch Normalization)层
  2. 一文读懂【数据埋点】
  3. windows如何配置mysql的环境变量
  4. 华为ENSP模拟器简易路由交换机分段划分Vlan
  5. Python中的循环遍历列表
  6. 计算机网络应用技术小结
  7. 语音生成视频论文:Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose
  8. java(jsp技术)
  9. 云服务器更新系统,云服务器能更新系统吗
  10. 基于php的简单聊天系统,基于PHP的网页即时聊天系统的设计与实现