c#与图像处理学习笔记
- 格式:docx
- 大小:71.16 KB
- 文档页数:11
c#与图像处理学习笔记
1、打开一幅图像
首先加入一个PictureBox 控件pictureBox1,然后打开一幅图像在该控件中显示:
private void buttonOpen_Click(object sender, System.EventArg e)
{
OpenFileDialog ofdlg = new OpenFileDialog();
ofdlg.Filter = “BMP 格式(*.BMP)|*.BMP|所有格式(*.*)|*.*”;
if(ofdlg.ShowDialog() == DialogResult.OK)
{
Bitmap image = new Bitmap(ofdlg.FileName);
pictureBox1.Image = image;
}
}
2、保存一幅图像
像上面那样已经打开一幅图像的前提下,将打开的图像保存:
private void buttonSave_Click(object sender, System.EventArg e)
{
string str;
Bitmap box1 = new Bitmap(pictureBox1.Image);
SaveFileDialog sfdlg = new SaveFileDialog();
sfdlg.Filter =”BMP 格式(*.BMP)|*.BMP|所有格式(*.*)|*.*”;
sfdlg.ShowDialog();
str=sfdlg.FileName;
pictureBox1.Image.Save(str);
}
3、图像拷贝和粘贴
在visual C#中,ClipBoard类提供了将数据放在系统剪贴板以及从系统剪贴板恢复数据的方法。
ClipBoard类只有三个成员,他们是剪贴板构造器,GetDataObject和SetDataObject。
剪贴板构造器用来创建一个剪贴板对象,GetDataObjec方法用来将数据复制或剪切到剪贴板上,SetDataObject方法负责从剪贴板中恢复数据,它将返回IDataObject。
拷贝:(将图像拷贝到剪贴板,前提是已经建立了两个PictureBox控件
pictureBox1和pictureBox2,并且pictureBox1已经打开了一幅图像) private void buttonCopy_Click ()
{
CilpBoard.SetDataObject(pictureBox1.Image);
}
粘贴:(将pictureBox1中复制到粘贴板中的图像粘贴到pictureBox2中)
private void buttonPaste_Click()
{
IDataObject iData="Clipboard".GetDataObject();
if(iData.GetDataPresent(DataFormats.Bitmap))
{
pictureBox2.Image=(Bitmap)iData.GetData(DataFormats.Bitmap);
}
}
彩色图像处理基础知识:
彩色位图的像素颜色由三种基本颜色R、G、B有机组合而成,R、G、B称为三基色,每种基色可取0~255范围内的任意值,因此三种基色可组合成256*256*256共1677万种颜色,每种颜色都有其对应的R、G、B值,常见的颜色机器对应的三原色值如表所示:
彩色位图颜色的分解:
Color c = new Color();
c = b1.GetPixel(i, j);
rr = c.R;
gg = c.G;
bb = c.B;
重新生成新的颜色:
Color c1=Color.FromArgb(rr, gg, bb);
b1.SetPixel(i, j, c1);
1、B单色处理:
首先加入两个PictureBox控件pictureBox1和pictureBox2,并且在pictureBox1中打开一幅图像,然后将处理后的图像显示在pictureBox2中,处理过程如下:
private void button1_Click(object sender, EventArgs e)
{
int i,j,bb;
Bitmap b1 = new Bitmap(pictureBox1.Image);
Bitmap b2 = b1;
Color cc = new Color();
for (i = 0; i < b1.Width; i++)
{
for (j = 0; j < b1.Height; j++)
{
cc = b1.GetPixel(i, j);
bb = cc.B;
Color c1 = Color.FromArgb(bb, bb, bb);
b2.SetPixel(i, j, c1);
}
}
pictureBox2.Image = b2;
}
2、G单色处理
处理方法和上面的B单色处理相似,只是用得到颜色的G值重构新颜色即可,gg = cc.B;
Color c1 = Color.FromArgb(gg, gg, gg);
3、R单色处理
处理方法和上面的B单色处理相似,只是用得到颜色的R值重构新颜色即可,rr = cc.B;
Color c1 = Color.FromArgb(rr, rr, rr);
4、平均处理
处理方法和上面的类似,只是颜色重构的时候有点区别,
cc = b1.GetPixel(i, j);
rr = cc.R;
gg = cc.G;
bb = cc.B;
rgb = (int)((rr + gg + bb) / 3); //rgb是一个int型的变量
if (rgb < 0)
rgb = 0;
if (rgb > 255)
rgb = 255;
Color c1=Color.FromArgb(rgb,rgb,rgb);
b2.SetPixel(i,j,c1);
用上面的程序分别对下面的图像进行处理,便可以清楚的体会图像的基本原理
颜色实验标准图像
彩色图像的变换:
彩色图像的变换主要包括:逆反变换、平滑处理、霓虹处理、锐化处理、浮雕处理、镶嵌处理、灰度处理、透明变换。
设f(i, j).R、f(i, j).G、f(i, j).B分别代表源图像像素点(i, j)点的R、G、B分量,rr、gg、bb分别为处理后的像素分量,各种处理方法的算法如下:
逆反处理:
算法: rr="255-f"(i,j).R gg=255-f(i,j).G bb=255-f(i,j).G 将处理后的分量合成新的像素重新放到点(i,j)处。
部分程序如下:
private void button_Click(object sender, EventArgs e)
{
Color cc = new Color();
Bitmap bitmap1 = new Bitmap(pictureBox1.Image);
Bitmap bitmap2 = bitmap1;
int i, j;
for (i = 0; i < bitmap1.Width; i++)
{
for (j = 0; j < bitmap1.Height; j++)
b1 = c1.B;
rr += r1;
gg += g1;
bb += b1;
}
}
rr = (int)(rr / 9);
gg = (int)(gg / 9);
bb = (int)(bb / 9);
if (rr < 0) rr = 0; //得到新的分量值后都要经过这样的处理限制他们的边界
if (rr > 255) rr="255"; //****以下的程序省略了这些相似的处理*****
if (gg < 0) gg = 0;
if (gg > 255) gg = 255;
if (bb < 0) bb = 0;
if (bb > 255) bb = 255;
c2 = Color.FromArgb(rr, gg, bb);
bitmap2.SetPixel(i, j, c2);
}
}
霓虹处理:
算法:首先计算源图像的像素(i, j)点的分量值与同行的下一个像素(i+1, j)以及相同列的下一个像素(i, j+1)的分量的梯度,即差的平方和的平方根,然后将梯度值作为新的像素重新放回(i, j)。
rr1 = ( f(i, j).R - f(i+1, j).R )^2
rr2 = ( f(i, j).R - f(i ,j+1).R )^2
rr = 2 * ( rr1 + rr2 )^0.5
用同样的方法得到gg、bb然后生成新的像素值放到(i, j)点。
部分程序如下:
c1 = bitmap1.GetPixel(i, j);
r1 = c1.R;
g1 = c1.G;
b1 = c1.B;
c1 = bitmap1.GetPixel(i + 1, j);
r2 = c1.R;
g2 = c1.G;
b2 = c1.B;
c1 = bitmap1.GetPixel(i, j + 1);
r3 = c1.R;
g3 = c1.G;
b3 = c1.B;
rr = (int)(255-2 * Math.Sqrt((r1 - r2) * (r1 - r2) + (r1 - r3) * (r1 - r3)));
gg = (int)(255-2 * Math.Sqrt((g1 - g2) * (g1 - g2) + (g1 - g3) * (g1 - g3)));
bb = (int)(255-2 * Math.Sqrt((b1 - b2) * (b1 - b2) + (b1 - b3) * (b1 - b3)));
锐化处理:
算法:将源图像像素f(i,j)的像素与相邻的像素f(i-1,j-1)像素值之差的绝对值的百分比之和作为新的像素放到(i,j)点
rr = f(i, j).R + 0.25*| f(i, j).R – f(i-1, j-1).R |
gg、bb的处理相同
部分程序如下:
rr = (int)(r1 + Math.Abs(r1 - r2) / 4);
gg = (int)(g1 + Math.Abs(g1 - g2) / 4);
bb = (int)(b1 + Math.Abs(b1 - b2) / 4);
浮雕处理:
算法:将f(i,j)与同行前一个点的像素之差加上一个常数得到新的像素放到(i,j)点rr =| f(i, j) - f(i-1, j) + 128 |
gg、bb的处理相同
部分程序如下:
rr = Math.Abs(r2 - r1 + 128);
gg = Math.Abs(g2 - g1 + 128);
bb = Math.Abs(b2 - b1 + 128);
镶嵌处理:
算法:镶嵌处理就是把源图像每一个小矩阵内的所有像素值都取此矩阵内各像素之歌的平均值。
rr =( f(i-1,j-1).R+ f(i-1,j).R+ f(i-1,j+1).R+ f(i,j-1).R+ f(i,j).R+ f(i,j+1).R+ f(i+1,j-1).R+ f(i+1,j).R+ f(i+1,j+1).R ) / 9
gg、bb的处理方法类似。
然后将处理后的分量值合成新的像素放到矩阵内的每一个点上。
部分程序如下:
for (i = 1; i < bitmap1.Width - 3; i+=4)
{
for (j = 1; j < bitmap1.Height - 3; j+=4)
{
rr = 0;
gg = 0;
bb = 0;
for (k1 = 0; k1 < 4; k1++)
{
for (k2 = -1; k2 < 4; k2++)
{
c1 = bitmap1.GetPixel(i + k1, j + k2);
r1 = c1.R;
g1 = c1.G;
b1 = c1.B;
rr += r1;
gg += g1;
bb += b1;
}
}
rr = (int)(rr / 16);
gg = (int)(gg / 16);
bb = (int)(bb / 16);
if (rr < 0)
rr = 0;
if (rr > 255)
rr = 255;
if (gg < 0)
gg = 0;
if (gg > 255)
gg = 255;
if (bb < 0)
bb = 0;
if (bb > 255)
bb = 255;
c2 = Color.FromArgb(rr, gg, bb);
for (k1 = 0; k1 < 4; k1++)
{
for (k2 = 0; k2 < 4; k2++)
{
bitmap2.SetPixel(i+k1, j+k2, c2);
}
}
}
}
灰度处理:灰度处理就是把某一灰度值范围内的灰度值变为相同的值。
算法:rr = ( f(i, j).R / 64 ) * 64
将得到的新的像素放到原来得到像素点处。
部分程序如下:
c1 = bitmap1.GetPixel(i, j);
r1 = c1.R;
g1 = c1.G;
b1 = c1.B;
rr = (r1 / 64) * 64;
gg = (g1 / 64) * 64;
bb = (b1 / 64) * 64;
if (rr < 0)
rr = 0;
if (rr > 255)
rr = 255;
if (gg < 0)
gg = 0;
if (gg > 255)
gg = 255;
if (bb < 0)
bb = 0;
if (bb > 255)
bb = 255;
c2 = Color.FromArgb(rr, gg, bb);
bitmap2.SetPixel(i, j, c2);
图像的透明处理:图像的透明处理就是通过获取图像的像素分量值,然后使用Color对象的FromArgb方法通过设置新的alpha值(0~255)创建新的像素。
部分程序如下:
for (i = 0; i < bitmap1.Width; i++)
{
for (j = 0; j < bitmap1.Height; j++)
{
c1 = bitmap1.GetPixel(i, j);
c2 = Color.FromArgb(trackBar1.Value, c1.R, c1.G, c1.B);
bitmap2.SetPixel(i, j, c2);
}
}。