基于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平滑后的图像。