图像锐化是使图像边缘更加清晰的一种图像处理方法。常用的做法是提取图像的高频分量,将其叠加到原图上。
图像高频分量的提取有两种做法:一种是用高通滤波器得到高频分量;另一种是用低通滤波器得到低频,然后用原图减去低频得到高频。
直接提取高频的方法有sobel算法、laplcian算子,sobel算子是图像的一阶导数,提取的是梯度信息,分水平和垂直两种,常常用来做边缘检测、方向判别,sobel算子在斜坡处不为0,因此会产生较粗的边缘。laplcian算子是图像的二阶导,在图像开始变化和结束变化的地方值不为0,渐变时结果为0,因此laplacian比sobel算子更适合做sharpen。
我们这里使用Laplacian算子进行锐化。
以自身灰度值的9倍减去周围像素点灰度值作为自身新的灰度值。可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是这个亮点变得更亮,增加了图象的噪声。因为图象中的边缘就是那些灰度发生跳变的区域,所以锐化模板在边缘检测中很有用。
private void But_sharpen_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null)
{
MessageBox.Show("错误,没有导入图片!");
return;
}
bt1 = new Bitmap(pictureBox1.Image);
bt2 = new Bitmap(pictureBox1.Image);
int R1, R2, R3, R4, R5, R6, R7, R8, R9, R;
int G1, G2, G3, G4, G5, G6, G7, G8, G9, G;
int B1, B2, B3, B4, B5, B6, B7, B8, B9, B;
for (int i = 1; i < bt1.Width - 1; i++)
{
for (int j = 1; j < bt1.Height - 1; j++)
{
R1 = bt1.GetPixel(i - 1, j - 1).R;
R2 = bt1.GetPixel(i - 1, j).R;
R3 = bt1.GetPixel(i - 1, j + 1).R;
R4 = bt1.GetPixel(i, j - 1).R;
R5 = bt1.GetPixel(i, j).R;
R6 = bt1.GetPixel(i, j + 1).R;
R7 = bt1.GetPixel(i + 1, j - 1).R;
R8 = bt1.GetPixel(i + 1, j).R;
R9 = bt1.GetPixel(i + 1, j + 1).R;
R = Math.Abs(R5*9-R1-R2-R3-R4-R6-R7-R8-R9);
G1 = bt1.GetPixel(i - 1, j - 1).G;
G2 = bt1.GetPixel(i - 1, j).G;
G3 = bt1.GetPixel(i - 1, j + 1).G;
G4 = bt1.GetPixel(i, j - 1).G;
G5 = bt1.GetPixel(i, j).G;
G6 = bt1.GetPixel(i, j + 1).G;
G7 = bt1.GetPixel(i + 1, j - 1).G;
G8 = bt1.GetPixel(i + 1, j).G;
G9 = bt1.GetPixel(i + 1, j + 1).G;
G = Math.Abs(G5*9-G1-G2-G3-G4-G6-G7-G8-G9);
B1 = bt1.GetPixel(i - 1, j - 1).B;
B2 = bt1.GetPixel(i - 1, j).B;
B3 = bt1.GetPixel(i - 1, j + 1).B;
B4 = bt1.GetPixel(i, j - 1).B;
B5 = bt1.GetPixel(i, j).B;
B6 = bt1.GetPixel(i, j + 1).B;
B7 = bt1.GetPixel(i + 1, j - 1).B;
B8 = bt1.GetPixel(i + 1, j).B;
B9 = bt1.GetPixel(i + 1, j + 1).B;
B = Math.Abs(B5*9-B1-B2-B3-B4-B6-B7-B8-B9);
if (R >= 255) R = 255;
if (G >= 255) G = 255;//判断是否超出各分量允许的范围,如果大于255则只能等于255
if (B >= 255) B = 255;
bt2.SetPixel(i, j, Color.FromArgb(R, G, B));
}
pictureBox2.Refresh();
pictureBox2.Image = bt2;
}
}