基于C#图像融合的设计.docx
- 文档编号:7680963
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:4.02MB
基于C#图像融合的设计.docx
《基于C#图像融合的设计.docx》由会员分享,可在线阅读,更多相关《基于C#图像融合的设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于C#图像融合的设计
数据图像处理
图
像
融
合
设
计
实
验
报
告
姓名:
赵远征、周术宝、朱亚君、左帅
学号:
20117750470、20117750471、
20117750472、20117750473
班级:
2011级软件开发.NET4班
设计题目:
图像融合
教师:
庞海波老师
提交日期:
12月23日
一、设计内容:
主题:
《图像融合》
详细说明:
分别读入资源图片和背景图片,对资源图分别进行色彩空间处理、三种颜色分量的变换、修改透明度并进行切割等操作。
将分割出来的资源图像复制到背景图像的对应的位置上(利用的是色素的拷贝)。
对最终融合的图像进行颜色和光照的处理。
二、现实意义:
对象场景融合在图像编辑领域有非常广泛的应用,特别是在影视制作过程中,很多镜头无法通过实地拍摄获得,这些镜头就可以借助对象场景融合技术来实现。
3、涉及知识内容:
1.读入图像
2.RGB色彩空间转换HSI色彩空间的算法
3.RGB色彩空间转换为灰度图形的算法
4.提取每个像素点上的各个的色彩分量
5.增减和减少每个色素点分量的值
6.在指点的区域空间上显示一张图片
7.按照指定的区域空间惊醒切割图像
8.像素的拷贝
9.把Graphics图像转换为Image图像
10.对图形的保存
11.对像素部分区域操作实现光照效果
12.保存操作完成的图片
4、实例分析及截图效果:
1.读入背景图和资源图片
实现代码
privatevoid打开资源图ToolStripMenuItem_Click(objectsender,EventArgse)
{
openFileDialog1.Filter="*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";
openFileDialog1.ShowDialog();
if(this.openFileDialog1.FileName.Trim()=="")
return;
try
{
ImagemyImage=System.Drawing.Image.FromFile(openFileDialog1.FileName);
MyBitmap=newBitmap(myImage);//把打开的图像赋给Bitmap变量
BitmapSrcBitmap=newBitmap(this.openFileDialog1.FileName);
MyBitmap=newBitmap(SrcBitmap,MyBitmap.Width,MyBitmap.Height);
pictureBox2.Visible=true;
pictureBox2.Width=myImage.Width;
pictureBox2.Height=myImage.Height;
this.pictureBox2.Image=MyBitmap;
//在控件上显示图像
theImage=pictureBox2.Image;
ig=Graphics.FromImage(MyBitmap);
ig.DrawImage(MyBitmap,pictureBox2.ClientRectangle);
}
catch
{
//提示对话框
MessageBox.Show(this,"打开图像文件错误","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
privatevoid打开背景图ToolStripMenuItem_Click(objectsender,EventArgse)
{
openFileDialog1.Filter="*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";
openFileDialog1.ShowDialog();
if(this.openFileDialog1.FileName.Trim()=="")
return;
try
{
ImagemyImage=System.Drawing.Image.FromFile(openFileDialog1.FileName);
MyBitmap=newBitmap(myImage);
editFileName=openFileDialog1.FileName;//把打开的图像赋给Bitmap变量
BitmapSrcBitmap=newBitmap(this.openFileDialog1.FileName);
MyBitmap=newBitmap(SrcBitmap,MyBitmap.Width,MyBitmap.Height);
myImage=Image.FromFile(openFileDialog1.FileName);
theImageB=Image.FromFile(openFileDialog1.FileName);
pictureBox1.Width=myImage.Width;
pictureBox1.Height=myImage.Height;
this.pictureBox1.Image=MyBitmap;
}
catch
{
//提示对话框
MessageBox.Show(this,"打开图像文件错误?
","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
运行结果截图
2.对资源图片进行红、绿、蓝三色的变化
实现代码(只显示了蓝色分量,红色和绿色类似)
privatevoid增强蓝色分量ToolStripMenuItem_Click(objectsender,EventArgse)
{
try
{
intHeight=this.pictureBox2.Image.Height;
intWidth=this.pictureBox2.Image.Width;
Bitmapnewbitmap=newBitmap(Width,Height);
Bitmapoldbitmap=(Bitmap)this.pictureBox2.Image;
Colorpixel;
for(intx=1;x { for(inty=1;y { intr,g,b; pixel=oldbitmap.GetPixel(x,y); r=pixel.R; g=pixel.G; b=pixel.B+10; if(b>=255) b=255; newbitmap.SetPixel(x,y,Color.FromArgb(r,g,b)); } } this.pictureBox2.Image=newbitmap; theImage1=newbitmap; theImage=newbitmap; } catch(Exceptionex) { MessageBox.Show(ex.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } 运行结果截图 3.调整HSI空间上的值(资源图和背景图) 实现代码 publicvoidadjustCom1(bytechangTab,intnumCom1,intnumCom2,intnumCom3,intp) { intHeight;intWidth; Bitmapnewbitmap;Bitmapoldbitmap; if(p==1) { Height=pictureBox2.Image.Height; Width=pictureBox2.Image.Width; newbitmap=newBitmap(Width,Height); oldbitmap=(Bitmap)pictureBox2.Image; } else{ Height=pictureBox1.Image.Height; Width=pictureBox1.Image.Width; newbitmap=newBitmap(Width,Height); oldbitmap=(Bitmap)pictureBox1.Image; } Colorpixel;doubler,g,b; if(changTab==255) { for(intx=1;x { for(inty=1;y { pixel=oldbitmap.GetPixel(x,y); r=pixel.R; g=pixel.G; b=pixel.B; newbitmap.SetPixel(x,y,Color.FromArgb((int)r,(int)g,(int)b)); } } } doublevalueCom1=numCom1/100.0; doublevalueCom2=numCom2/100.0; doublevalueCom3=numCom3/100.0; doublehue,sat,inten; if(changTab==0) { for(intx=1;x { for(inty=1;y { pixel=oldbitmap.GetPixel(x,y); r=pixel.R; g=pixel.G; b=pixel.B; if(valueCom1<=0) r=(byte)(r*(1.0+valueCom1)); else r=(byte)(r+(255.0-r)*valueCom1); if(valueCom2<=0) g=(byte)(g*(1.0+valueCom2)); else g=(byte)(g+(255.0-g)*valueCom2); if(valueCom3<=0) b=(byte)(b*(1.0+valueCom3)); else b=(byte)(b+(255.0-b)*valueCom3); newbitmap.SetPixel(x,y,Color.FromArgb((int)r,(int)g,(int)b)); } } } else { valueCom1=valueCom1*Math.PI/1.8; for(intx=1;x { for(inty=1;y { pixel=oldbitmap.GetPixel(x,y); r=pixel.R/255.0; g=pixel.G/255.0; b=pixel.B/255.0; doubletheta=Math.Acos(0.5*((r-g)+(r-b))/Math.Sqrt((r-g)*(r-g)+(r-b)*(g-b)+0.0000001))/(2*Math.PI); hue=(b<=g)? theta: (1-theta); sat=1.0-3.0*Math.Min(Math.Min(r,g),b)/(r+g+b+0.0000001); inten=(r+g+b)/3.0; hue=hue*2*Math.PI; hue=(hue+valueCom1+2*Math.PI)%(2*Math.PI); if(valueCom2<=0) sat=sat*(1.0+valueCom2); else sat=sat+(1.0-sat)*valueCom2; if(valueCom3<=0) inten=inten*(1.0+valueCom3); else { inten=inten+(1.0-inten)*valueCom3; if(sat==1.0) sat=sat*(1-valueCom3); } if(sat==0.0) hue=0; if(hue>=0&&hue<2*Math.PI/3) { b=inten*(1-sat); r=inten*(1+sat*Math.Cos(hue)/Math.Cos(Math.PI/3-hue)); g=3*inten-(r+b); } elseif(hue>=2*Math.PI/3&&hue<4*Math.PI/3) { r=inten*(1-sat); g=inten*(1+sat*Math.Cos(hue-2*Math.PI/3)/Math.Cos(Math.PI-hue)); b=3*inten-(r+g); } else{ g=inten*(1-sat); b=inten*(1+sat*Math.Cos(hue-4*Math.PI/3)/Math.Cos(5*Math.PI/3-hue)); r=3*inten-(g+b); } if(r>1) r=1; if(g>1) g=1; if(b>1) b=1; r=r*255; g=g*255; b=b*255; newbitmap.SetPixel(x,y,Color.FromArgb((int)r,(int)g,(int)b)); } } } if(p==1) { this.pictureBox2.Image=newbitmap; theImage=newbitmap; } else this.pictureBox1.Image=newbitmap; } 运行结果截图 4.调整透明度 实现代码 publicvoidTouMing(intn) { try { float[][]nArray={newfloat[]{1,0,0,0,0}, newfloat[]{0,1,0,0,0}, newfloat[]{0,0,1,0,0}, newfloat[]{0,0,0,n*0.1f,0}, newfloat[]{0,0,0,0,1}}; ColorMatrixmatrix=newColorMatrix(nArray); ImageAttributesattributes=newImageAttributes(); attributes.SetColorMatrix(matrix,ColorMatrixFlag.Default,ColorAdjustType.Bitmap); Bitmapoldbitmap=(Bitmap)theImage; BitmapresultImage=newBitmap(oldbitmap.Width,oldbitmap.Height); Graphicsg=Graphics.FromImage(resultImage); g.DrawImage(oldbitmap,newRectangle(0,0,oldbitmap.Width,oldbitmap.Height),0,0,oldbitmap.Width,oldbitmap.Height,GraphicsUnit.Pixel,attributes); this.pictureBox2.Image=resultImage; theImage1=pictureBox2.Image; } catch(Exceptionex) { MessageBox.Show(ex.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } 运行结果截图 5.切割 实现代码 1 固定需要切割的区域 privatevoidpictureBox2_MouseMove(objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Right) { if(flag) { pictureBox2.Left=pictureBox2.Left+(e.X-x); pictureBox2.Top=pictureBox2.Top+(e.Y-y); } } else { Graphicsg; g=pictureBox2.CreateGraphics(); if(isDrawing) { switch(tool) { caseTools.None: break; caseTools.Pen: //从上一个点到当前点绘制线段 g.DrawLine(newPen(foreColor,1),oldPoint,newPoint(e.X,e.Y)); ig.DrawLine(newPen(foreColor,1),oldPoint,newPoint(e.X,e.Y)); oldPoint.X=e.X; oldPoint.Y=e.Y; break; caseTools.Ellipse: //首先恢复此次操作之前的图像,然后再添加Ellipse this.pictureBox2_Paint(this,newPaintEventArgs(pictureBox2.CreateGraphics(),pictureBox2.ClientRectangle)); g.DrawEllipse(newPen(foreColor,1),startPoint.X,startPoint.Y,e.X-startPoint.X,e.Y-startPoint.Y); w=e.X-startPoint.X;h=e.Y-startPoint.Y; break; caseTools.Rectangle: //首先恢复此次操作之前的图像,然后再添加Rectangle this.pictureBox2_Paint(this,newPaintEventArgs(pictureBox2.CreateGraphics(),pictureBox2.ClientRectangle)); g.DrawRectangle(newPen(foreColor,1),startPoint.X,startPoint.Y,e.X-startPoint.X,e.Y-startPoint.Y); w=e.X-startPoint.X;h=e.Y-startPoint.Y; break; } } } } 2 切割 Privatevoid切割ToolStripMenuItem1_Click(objectsender,EventArgse) { try { if(tool==Tools.Rectangle) { Bitmapnewbitmap=newBitmap(w,h); Bitmapoldbitmap=(Bitmap)theImage1; newbitmap=oldbitmap; Rectanglerc=newRectangle(startPoint.X,startPoint.Y,w,h); Bitmapbt=oldbitmap.Clone(rc,oldbitmap.PixelFormat); pictureBox2.Visible=true; this.pictureBox2.Width=bt.Width; this.pictureBox2.Height=bt.Height; this.pictureBox2.Image=bt; theImage=bt; } } catch(Exceptionex) { MessageBox.Show(ex.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } 运行结果截图 a.划分区域图 b.切割图 6.合成一张图片 实现代码 privatevoidpictureBox1_MouseDoubleClick(objectsender,MouseEventArgse) { try { System.Drawing.ImagecopyImage=pictureBox2.Image; Bitmapbmp=newBitmap(pictureBox1.Image); Graphicsg2=Graphics.FromImage(bmp); g2.DrawImage(copyImage,e.X,e.Y,copyImage.Width,copyImage.Height); pictureBox1.Image=bmp; } catch(Exceptionex) { MessageBox.Show(ex.Message,"信息提示",MessageBoxButtons.OK,M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 C# 图像 融合 设计