您的位置:首页 > 编程语言 > C#

C#与图像处理学习笔记(三)

2009-07-12 02:43 253 查看
http://blog.ednchina.com/cola123/206471/message.aspx



彩色图像的变换:
彩色图像的变换主要包括:逆反变换、平滑处理、霓虹处理、锐化处理、浮雕处理、镶嵌处理、灰度处理、透明变换。
设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++)
{
cc = bitmap1.GetPixel(i, j);
Color c1 = Color.FromArgb(255-cc.R, 255-cc.G, 255-cc.B);
bitmap2.SetPixel(i, j, c1);
}
}
pictureBox2.Image = bitmap2;
}

平滑处理:
平滑处理就是将源图像的每一个像素的颜色值由与其相邻的N*N个像素的平均值代替,下面以3*3点阵为例介绍一下平滑处理的算法。
算法:

f(i-1,j-1)

f(i,j-1)
f(i+1,j-1)
f(i-1,j)
f(i,j)
f(i+1,j)
f(i-1,j+1)
f(i,j+1)
f(i+1,j+1)
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的处理方法和rr相同,将处理后的rr、gg、bb重新生成新的像素放到(i, j)点
部分程序如下:
for (i = 1; i < bitmap1.Width-1; i++)
{
for (j = 1; j < bitmap1.Height-1; j++)
{
rr=0;
gg=0;
bb=0;
for (k1 = -1; k1 < 2; k1++)
{
for (k2 = -1; k2 < 2; 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 / 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: