- 利用空间域滤波对图像进行增强处理,要求:
● 通过C#控制台应用程序读入一个灰度图像;
● 获取灰度图像的像素值,并存入二维数组;
● 选择不同的空间域滤波器对二维数组进行卷积运算;
● 利用卷积运算后的新图像像素值重新生成图像,并存储图像文件。
1 由于读取图像和存储图像、对图像变量进行操作,均需要使用Bitmap类,该类需要在解决方案资源管理器添加引用“System.Drawing”,并在Program.cs代码文件中引用命名空间“using System.Drawing;”:
2 读取灰度图像文件,并存入图像实例(如myImage):
string filename = "E:\a.jpg"; //换成自己的图像文件地址
Bitmap myImage = new Bitmap(filename);
int x = myImage.Width; //图像的宽度,即列数
int y = myImage.Height; //图像的高度,即行数
请自行声明二维数组(如pixel[,])用以存放图像像素值。
3 像元[i,j]处像素值的获取,可使用图像实例的GetPixel()方法:
//因为是灰度图像,所以每个像素的RGB三个通道值均可作为图像亮度值
pixels[i, j] = myImage.GetPixel(i, j).R;
4 要求从控制台读入一个整数,并根据整数值选择相应的滤波器,如果输入的整数不是正确序号,应该给出处理的方法(使用goto跳转语句),可参考:
5 根据选择的滤波器进行卷积运算,使用的滤波器包括(也可自行设计滤波器):
均值滤波:
中值滤波:9个像元按大小排序,求中间位置的像元。
Prewitt梯度:注意两个模版分别卷积计算后的绝对值再求和
拉普拉斯算子:(正负号也可颠倒)
注意:
➢ 卷积运算是由当前像元和8个邻域与滤波器对应位置权重值相乘后求和(中值滤波是排序取中间值,Prewitt梯度是两个权重模板);
➢ 图像边缘的像素8个邻域有缺失,因此需要对图像外围进行填充,或者直接放弃边缘像素(此时图像比原来小一圈),如下图所示;
➢ 可定义卷积运算的静态方法(在类的内部,静态方法可直接通过方法名调用,不需要加类名;实例方法必须通过实例来调用),将输入的滤波器序号作为输入参数,设置选择语句(if或switch)控制不同的计算形式;
➢ 考虑到像素值表示亮度,在图像中用以合成颜色,而经过卷积运算的图像像素值可能超过0
6 卷积运算后得到新的图像像素值,要使用该值构建颜色变量(RGB三通道),然后将每个像素的颜色变量赋给图像像素(可使用原有图像实例myImage或创建新的图像实例newImage)
Bitmap newImage = new Bitmap(x, y);//创建一个新图像变量
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
Color c = Color.FromArgb(pixels[i, j], pixels[i, j], pixels[i, j]); //通过像素值生成颜色
newImage.SetPixel(i, j, c); //将颜色赋给对应的像元
}
}
7 将重新赋值后的图像变量进行输出,保存为图像文件:
newImage.Save("E:\a" + s + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); //将新图像变量存储为图像文件