基于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 for (int x=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 for (int x=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平滑后的图像。