# 基于C#与opencv的图像处理应用程序
# 一、实验方案设计
- **总体思路**
- 采用C#Form窗体应用程序进行实验,实现对两幅有重叠区域的图片进行分析处理,并无缝拼接
- **关键步骤**
- 调用Windows文件系统接口打开图片文件,并输出到界面
- 对两幅图片色彩度、大小等数据进行分析,以便进行相应处理
- 分析图片重叠区域
- 若图片高度相同,则按正常情况拼接
- 若两幅图片色彩度不同,则以色彩度较高的图片为准进行拼接
- 若两幅图片大小不同,则将较小图片放大后与另一张图片进行拼接
- 调用Windows文件系统接口保存图片,图片名、路径自命名
- 附加功能编写,设计图片按角度旋转、左右上下翻转、灰度化处理等
# 二、关键代码阐述
**打开图片文件,处理时将图片副本进行处理、输出显示,以便还原图片状态**
```c#
//打开图片(采用输入流打开,防止文件被锁定而导致只能另存为无法保存)
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = openFileDialog1.FileName;
name = openFileDialog1.FileNames.ToString();
FileStream file = new FileStream(path, FileMode.OpenOrCreate);
pictureBox1.Image = Image.FromStream(file);
bitmap = (Bitmap)pictureBox1.Image;
w = bitmap.Width;
h = bitmap.Height;
pictureBox1.Image = bitmap.Clone() as Image;
bar = (Bitmap)pictureBox1.Image.Clone();
file.Close();
}
}
```
**图片拼接。传入两个Image图片,对图片list遍历拼接**
```c#
private Image JoinImage(List<Image> imageList, int a)
{
//图片列表
if (imageList.Count <= 0)
return null;
if (a == 0)
{
//横向拼接
int width = 0;
//计算总长度
foreach (Image i in imageList)
{
width += i.Width;
}
//高度不变
//int height = imageList.Max(x => x.Height);
int height = imageList[1].Height;
//构造最终的图片白板
Bitmap tableChartImage = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(tableChartImage);
//初始化这个大图
graph.DrawImage(tableChartImage, width, height);
//初始化当前宽
int currentWidth = 0;
foreach (Image i in imageList)
```
**保存图片,图片名、路径自命名**
```c#
//另存为
private void button8_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null)
{
MessageBox.Show("请导入图片文件");
}
else
{
saveFileDialog1.InitialDirectory = "";
saveFileDialog1.Filter = "Bitmap (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg|EMF (*.emf)|*.emf|PNG (*.png)|*.png|GIF (*.gif)|*.gif|TIFF (*.tif)|*.tif";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string folderP = saveFileDialog1.FileName;
Image img = pictureBox1.Image;
img.Save(folderP);
}
}
}
```
**附加功能编写,设计图片按角度旋转、左右上下翻转、灰度化处理等**
```c#
//任意角度旋转
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text == ""&& pictureBox1.Image == null)
{
MessageBox.Show("请导入图片文件");
}
else if(textBox1.Text == "" && pictureBox1.Image != null)
{
MessageBox.Show("请输入旋转角度");
}
else
{
Bitmap a = new Bitmap(pictureBox1.Image);//得到图片框中的图片
pictureBox1.Image = Rotate(Convert.ToInt32(textBox1.Text),a);
bar = (Bitmap)pictureBox1.Image.Clone();
}
}
//灰度化处理
private void button5_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == null)
{
MessageBox.Show("请导入图片文件");
}
else
{
Bitmap c = new Bitmap(pictureBox1.Image);
pictureBox1.Image = GetGrayImage(c) as Image;
bar = (Bitmap)pictureBox1.Image.Clone();
}
}
```
# 三、结论/程序运行情况
**正常拼接**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f85fb29aedd864bcaaa6e537387aa4c8.writebug)
**不同色彩度图片拼接**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/991c1699afd8bc0ae50f4634308abae2.writebug)
**不同大小图片拼接**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2c467f8300b2b07d7f9edab6a5e2930e.writebug)
**图片保存**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/3b6fe4767300e34690d6ab724924d408.writebug)
**附加功能:灰度化、翻转、角度旋转**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c70c874cc0a9514e4be8663b6a995b61.writebug)
# 四、小结
- 了解到了许多数字图像处理相关方面的知识
- 对Windows系统中调用、处理文件等方面有了更深的理解
- 对openCV库有一定的认识
- 代码遇到问题时要抓住步骤核心分析