C#圖形處理系列(三)——霓虹處理、浮雕處理

來源:互聯網
上載者:User

    霓虹處理與浮雕處理演算法有共同之處,都是像素及鄰近像素直接關係運算,因此放到一起寫。

霓虹處理

      關於霓虹燈的效果,不知道的可以baidu圖片裡面看看。

霓虹處理演算法:同樣以3*3的點陣為例,目標像素g(i,j)應當以f(i,j)與f(i,j+1),f(i,j)與f(i+1,j)的梯度作為R,G,B分量,我們不妨設f(i,j)的RGB分量為(r1, g1, b1), f(i,j+1)為(r2, g2, b2), f(i+1,j)為(r3, g3, b3), g(i, j)為(r, g, b),那麼結果應該為
r = 2 * sqrt( (r1 - r2)^2 + (r1 - r3)^2 )
g = 2 * sqrt( (g1 - g2)^2 + (g1 - g3)^2 )
b = 2 * sqrt( (b1 - b2)^2 + (b1 - b3)^2 )

f(i,j)=2*sqrt[(f(i,j)-f(i+1,j))^2+(f(i,j)-f(,j+1))^2]

 

/// <summary>
/// 霓虹處理
/// </summary>
public class NeonImage : IImageProcessable
{

public void ProcessBitmap(Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;
for (int i = 0; i < width - 1; i++)//注意邊界的控制
{
for (int j = 0; j < height - 1; j++)
{
Color cc1 = bmp.GetPixel(i, j);
Color cc2 = bmp.GetPixel(i, j + 1);
Color cc3 = bmp.GetPixel(i + 1, j);

int rr = 2 * (int)Math.Sqrt((cc3.R - cc1.R) * (cc3.R - cc1.R) + (cc2.R - cc1.R) * (cc2.R - cc1.R));
int gg = 2 * (int)Math.Sqrt((cc3.G - cc1.G) * (cc3.G - cc1.G) + (cc2.G - cc1.G) * (cc2.G - cc1.G));
int bb = 2 * (int)Math.Sqrt((cc3.B - cc1.B) * (cc3.B - cc1.B) + (cc2.B - cc1.B) * (cc2.B - cc1.B));


if (rr > 255) rr = 255;
if (gg > 255) gg = 255;
if (bb > 255) bb = 255;
bmp.SetPixel(i, j, Color.FromArgb(rr, gg, bb));

}
}
}


#region IImageProcessable 成員


public unsafe void UnsafeProcessBitmap(Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* ptr = (byte*)(bmpData.Scan0);
for (int i = 0; i < height-1; i++)
{
for (int j = 0; j < width-1; j++)
{
byte bb=(byte)(2 * Math.Sqrt((ptr[4]-ptr[0])*(ptr[4]-ptr[0]))+(ptr[bmpData.Stride]-ptr[0])*(ptr[bmpData.Stride]-ptr[0]));//b;
byte gg = (byte)(2 * Math.Sqrt((ptr[5] - ptr[1]) * (ptr[5] - ptr[1])) + (ptr[bmpData.Stride+1] - ptr[1]) * (ptr[bmpData.Stride+1] - ptr[1]));//g
byte rr = (byte)(2 * Math.Sqrt((ptr[6] - ptr[2]) * (ptr[6] - ptr[2])) + (ptr[bmpData.Stride+2] - ptr[2]) * (ptr[bmpData.Stride+2] - ptr[2]));//r
if (rr > 255) rr = 255;
if (gg > 255) gg = 255;
if (bb > 255) bb = 255;
ptr[0] = bb;
ptr[1] = gg;
ptr[2] = rr;
ptr += 4;
}
ptr += bmpData.Stride - width * 4;
}
bmp.UnlockBits(bmpData);
}

#endregion
}

 

 

浮雕處理

浮雕處理原理: 通過對映像像素點的像素值與相鄰像素點的像素值相減後加上一個常數(一般為128), 然後作為新的像素點的值.

/********************************************************************
*
* 浮雕處理原理:通過對映像像素點的像素值與相鄰像素點的像素值相減後加上128, 然後作為新的像素點的值...

* g(i,j)=f(i,i)-f(i+1,j)+128
*
* ******************************************************************/


/// <summary>
/// 浮雕處理
/// </summary>
public class ReliefImage:IImageProcessable
{


public void ProcessBitmap(System.Drawing.Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;
for (int i = 0; i < width-1; i++)//注意控制邊界 相鄰元素 i+1=width
{
for (int j = 0; j < height; j++)
{
Color c1 = bmp.GetPixel(i, j);
Color c2 = bmp.GetPixel(i + 1, j);//相鄰的像素
int rr = c1.R - c2.R + 128;
int gg = c1.G - c2.G + 128;
int bb = c1.B - c2.B + 128;

//處理溢出
if (rr > 255) rr = 255;
if (rr < 0) rr = 0;
if (gg > 255) gg = 255;
if (gg < 0) gg = 0;
if (bb > 255) bb = 255;
if (bb < 0) bb = 0;

bmp.SetPixel(i,j,Color.FromArgb(rr,gg,bb));
}
}
}


#region IImageProcessable 成員


public unsafe void UnsafeProcessBitmap(Bitmap bmp)
{
int width = bmp.Width;
int height = bmp.Height;
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
byte* ptr = (byte*)(bmpData.Scan0);
int rr = 0,gg=0,bb=0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width-1; j++)
{
bb =(ptr[0] - ptr[4] + 128);//B
gg = (ptr[1] - ptr[5] + 128);//G
rr = (ptr[2] - ptr[6] +128); ;//R

//處理溢出
if (rr > 255) rr = 255;
if (rr < 0) rr = 0;
if (gg > 255) gg = 255;
if (gg < 0) gg = 0;
if (bb > 255) bb = 255;
if (bb < 0) bb = 0;

ptr[0] = (byte)bb;
ptr[1] = (byte)gg;
ptr[2] = (byte)rr;

ptr += 4;
}
ptr += bmpData.Stride - width * 4;
}
bmp.UnlockBits(bmpData);
}

#endregion
}

 

 

 

從圖裡面可以看出,浮雕處理並沒有讓圖片“失真”,儘管處理成浮雕了,浮雕仍然很清晰。公式中為什麼是128,可以用其他常數試試就知道了,如果過小,則圖片偏黑色,如果

過大,則圖片偏白色,128剛好。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.