基于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页】

【我还是不太理解该算法实现锐化的原理??】

原图像:

wps_clip_image-355

锐化后的图像:

wps_clip_image-365

代码如下:

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平滑后的图像:

wps_clip_image-2337

unsharp masking后的图像:

wps_clip_image-2363

可见,与第一种算法所得的图像结果基本相同。

关键代码:

g[x,y] = (byte)(f[x,y] - 0.7*f1[x,y]);

f[x,y]为原图像,f1[x,y]为Gauss平滑后的图像。

原创粉丝点击