基于Laplacian算子的图像锐化及非锐化屏蔽(unsharp masking)
来源:互联网 发布:java 写字符串到文件 编辑:程序博客网 时间:2024/04/29 03:22
基于Laplacian算子的图像锐化:
图像锐化(sharpening)[Rosenfeld and Kak 82]的目标是使边缘更陡峭,锐化的图像是供人观察的。锐化的输出图像f是根据下式从输入图像g得到的:
f(i,j) = g(i,j) - CS(i,j) (4.40)
其中C是反映锐化强度的正系数,S(i,j)是图像函数锐化程度的度量,用梯度算子来计算。Laplacian常被用于这一目的。
【摘自:图像处理、分析与机器视觉(第二版),Milan Sonka, Vaclav Hlavac,Roger Boyle著,艾海舟、武勃等译,人民邮电出版社,2003年9月第一版,第53页】
【我还是不太理解该算法实现锐化的原理??】
原图像:
锐化后的图像:
代码如下:
void Filter2D(byte[,]f,byte[,]g,float[,]mask,int offset)
{
int w = f.GetLength(0);
int h = g.GetLength(1);
int M = mask.GetLength(0)/2;
int N = mask.GetLength(1)/2;
for (int y=N;y<h-N;y++)
for (int x=M;x<w-M;x++)
{
float r = offset;
for (int m=-M;m<=M;m++)
for (int n=-N;n<=N;n++)
{
r+=f[x+m,y+n]*mask[M+m,N+n];
}
// if (r>255) r = 255;
// if (r<0) r = 0;
// g[x,y] = (byte)r;
g[x,y] = (byte)(f[x,y] - 0.7 * r);//实现锐化的关键代码
}
}
byte [,] GetLapEdge(byte [,]f)
{
int w = f.GetLength(0);
int h = f.GetLength(1);
byte [,] g = new byte[w,h];
for (int y=1;y<h-1;y++)
for (int x=1;x<w-1;x++)
{
g[x,y] = 0;
if (f[x,y]>=128 && (f[x-1,y]-128)*(f[x+1,y]-128)<0) g[x,y] = 255;
if (f[x,y]>=128 && (f[x,y-1]-128)*(f[x,y+1]-128)<0) g[x,y] = 255;
if (f[x,y]>=128 && (f[x+1,y+1]-128)*(f[x-1,y-1]-128)<0) g[x,y] = 255;
if (f[x,y]>=128 && (f[x+1,y-1]-128)*(f[x-1,y+1]-128)<0) g[x,y] = 255;
}
return g;
}
float [,] MkGMask7X7(float r)
{
float [,] mask = new float[7,7];
for (int m=-3;m<=3;m++)
for (int n=-3;n<=3;n++)
{
mask[3+m,3+n] = (float)Exp(-(m*m+n*n)/2.0/(r*r));
}
float s = 0;
for (int m=-3;m<=3;m++)
for (int n=-3;n<=3;n++)
{
s+=mask[3+m,3+n];
}
for (int m=-3;m<=3;m++)
for (int n=-3;n<=3;n++)
{
mask[3+m,3+n]=mask[3+m,3+n]/s;
}
return mask;
}
void main()
{
byte [,] f = LoadImg();
ShowImg("f",f);
int w = f.GetLength(0);
int h = f.GetLength(1);
float [,] mask = new float[3,3];
mask[0,0] = 0; mask[1,0] =-1; mask[2,0] = 0;
mask[0,1] =-1; mask[1,1] = 4; mask[2,1] =-1;
mask[0,2] = 0; mask[1,2] =-1; mask[2,2] = 0;
byte [,] f1 = new byte[w,h];
Filter2D(f,f1,MkGMask7X7(2.5f),0);
ShowImg("Sharpen",f1);
byte [,] g = new byte[w,h];
Filter2D(f1,g,mask,128);
ShowImg("Lap",g);
ShowImg("edge",GetLapEdge(g));
}
非锐化屏蔽(unsharp masking)是与公式(4.40)类似的图像锐化技术,常用于印刷行业[Jain 89]。一个与非锐化图像(例如,用平滑算子很强地模糊了的图像)成比例的信号被从原始图像中剪掉。
原图像同上,Gauss平滑后的图像:
unsharp masking后的图像:
可见,与第一种算法所得的图像结果基本相同。
关键代码:
g[x,y] = (byte)(f[x,y] - 0.7*f1[x,y]);
f[x,y]为原图像,f1[x,y]为Gauss平滑后的图像。
- 基于Laplacian算子的图像锐化及非锐化屏蔽(unsharp masking)
- 非锐化掩蔽(Unsharp Masking)与高提升滤波
- 图像边缘锐化- Sharpening filter, Unsharp masking & Highboost filtering
- 基于拉普拉斯算子的图像锐化
- 基于拉普拉斯算子的图像锐化
- Laplacian锐化图像
- opencv入门学习之八:非锐化掩蔽(Unsharp Masking)与高提升滤波
- 【算法学习】【图像增强】基于拉普拉斯算子的图像锐化
- 图像锐化-拉普拉斯算子
- 利用拉普拉斯算子进行图像的锐化
- 拉普拉斯(laplacian)滤波实现图像锐化分析
- 图像处理(二)laplacian锐化
- 基于OpenCV的Laplace图像锐化算法
- 图像的锐化
- 图像的锐化
- 图像增强(锐化)相关算子
- Unsharp Mask(USM)锐化算法的的原理及其实现
- Unsharp Mask(USM)锐化算法的的原理及其实现。
- 如何操作我的程序的另一个实例
- 今天开始认真学习编程
- 谈PHP5.3闭包特性在实际应用中的问题
- Linux实验报告4
- Java Filter过滤器使用
- 基于Laplacian算子的图像锐化及非锐化屏蔽(unsharp masking)
- 异常:java.lang.NoSuchFieldError: deferredExpression解决
- Linux实验报告3
- asp.net读取资源文件的另一种用法
- 弄懂怎么识别简单的认证码了
- webserver&applicationserver
- 从属性文件中获得连接字符串
- 取得IWebBrowser2的窗体句柄
- 掌握各linux 常用命令的使用