📄 filters.cs
字号:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
namespace sample
{
/// <summary>
/// 图像处理类
/// </summary>
public class Filters
{
public Filters()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static bool Invert(Bitmap b, out int[] outGray)
{
int [] newGray = new int[256];
foreach(int i in newGray)
{
newGray[i]=0;
}
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
int nWidth = b.Width;
int tt;
for(int y=0;y < b.Height; ++y)
{
for(int x=0; x < nWidth; ++x )
{
tt = p[0] = (byte)(255-p[0]);
p[1] = (byte)(255-p[1]);
p[2] = (byte)(255-p[2]);
newGray[tt]++;
p += 3;
}
p += nOffset;
}
}
outGray = newGray ;
b.UnlockBits(bmData);
return true;
}
public static bool Gray(Bitmap b, out int[] outGray)
{
int [] newGray = new int[256];
foreach(int i in newGray)
{
newGray[i]=0;
}
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
byte red, green, blue;
int tt;
for(int y=0;y < b.Height; ++y)
{
for(int x=0; x < b.Width; ++x )
{
blue = p[0];
green = p[1];
red = p[2];
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
newGray[tt]++;
p += 3;
}
p += nOffset;
}
}
outGray =newGray ;
b.UnlockBits(bmData);
return true;
}
public static bool Brightness(Bitmap b,int[] FrequenceGray,out int[] all,int pixelsSource)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
int tt=0;
int [] gray=new int[256];
int [] SumGray=new int[256];
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
int nHeight = b.Height;
int nWidth = b.Width ;
foreach(int i in gray)
{
gray[i]=0;
}
//灰度均衡化
SumGray[0]=FrequenceGray[0];
for(int i=1;i<256;++i)
//灰度级频度数累加
SumGray[i]=SumGray[i-1]+FrequenceGray[i];
for(int i=0;i<256;++i)
//计算调整灰度值
SumGray[i]=(int)(SumGray[i]*255/pixelsSource);
for(int y=0;y < nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
tt = p[0] = p[1] = p[2] =(byte)(SumGray[p[0]]);
gray[tt]++;
p+=3;
}
p += nOffset;
}
}
all=gray;
b.UnlockBits(bmData);
return true;
}
public static bool modu1(Bitmap image,int r,int g,int b)
{
if(r==0) r=1;
if(g==0) g=1;
if(b==0) b=1;
BitmapData bmData = image.LockBits(new Rectangle(0, 0,image.Width , image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - image.Width*3;
int nWidth=image.Width;
int nHeight=image.Height;
int red,green,blue;
int w0=(int)(nWidth/2);
int h0=(int)(nHeight/2);
int r0,t1,t2,kr=r,kg=g,kb=b;
double z,z0;
int k1r=r,k1g=g,k1b=b,
k2r=r,k2g=g,k2b=b,
k3r=r,k3g=g,k3b=b,
k4r=r,k4g=g,k4b=b;
if(w0>h0)
r0=w0;
else
r0=h0;
z0=Math.Sqrt(w0*w0+h0*h0);
z0=z0/1.5;
for(int y=0;y<nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
red=p[2];
green=p[1];
blue=p[0];
t1=x-w0;
t2=y-h0;
if(t1<0) t1=0-t1;
if(t2<0) t2=0-t2;
z=Math.Sqrt(t1*t1+t2*t2);
if(z<z0)
{
z=z0;
kr=0;
kg=0;
kb=0;
}
else
{
double xx=(z-z0)/z;
kr=(int)(15*r*xx*xx);
kg=(int)(15*g*xx*xx);
kb=(int)(15*b*xx*xx);
}
red+=kr;
green+=kg;
blue+=kb;
if(red>255) red=255;
if(red<0) red=0;
if(green>255) green=255;
if(green<0) green=0;
if(blue>255) blue=255;
if(blue<0) blue=0;
p[2]=(byte)red;
p[1]=(byte)green;
p[0]=(byte)blue;
p+=3;
}
p += nOffset;
}
}
image.UnlockBits(bmData);
return true;
}
/// <summary>
/// 反差圆补偿
/// </summary>
/// <param name="image">图像</param>
/// <param name="con">反差系数</param>
/// <param name="k">圆半径系数</param>
/// <returns></returns>
public static bool ccon(Bitmap image,float con,float k)
{
BitmapData bmData = image.LockBits(new Rectangle(0, 0,image.Width , image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - image.Width*3;
int nWidth=image.Width;
int nHeight=image.Height;
int red,green,blue;
int w0=(int)(nWidth/2);
int h0=(int)(nHeight/2);
int r0,t1,t2;
double z,z0,pixel,contrast;
if(w0>h0)
r0=w0;
else
r0=h0;
z0=Math.Sqrt(w0*w0+h0*h0);
z0=z0/k;
for(int y=0;y<nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
red=p[2];
green=p[1];
blue=p[0];
t1=x-w0;
t2=y-h0;
if(t1<0) t1=0-t1;
if(t2<0) t2=0-t2;
z=Math.Sqrt(t1*t1+t2*t2);
if(z>z0)
{
contrast = (z-z0)/z * con ;
pixel = red-(127-red) * contrast;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;
pixel = green-(127-green) * contrast;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;
pixel = blue-(127-blue) * contrast;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;
}
p+=3;
}
p += nOffset;
}
}
image.UnlockBits(bmData);
return true;
}
/// <summary>
/// 基本反差调整
/// </summary>
/// <param name="b"></param>
/// <param name="nContrast"></param>
/// <returns></returns>
public static bool Contrast(Bitmap b, int nContrast)
{
if (nContrast < -100) return false;
if (nContrast > 100) return false;
double pixel = 0, contrast = (100.0+nContrast)/100.0;
contrast *= contrast;
int red, green, blue;
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
int h=b.Height,w=b.Width;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
for(int y=0;y<h;++y)
{
for(int x=0; x < w; ++x )
{
blue = p[0];
green = p[1];
red = p[2];
pixel = red/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[2] = (byte) pixel;
pixel = green/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[1] = (byte) pixel;
pixel = blue/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}
public static bool zft(Bitmap b,out int[] all,out int[] rhow, out int[] ghow,out int[] bhow)
{
int [] gray=new int[256];
int [] rr = new int[256];
int [] gg = new int[256];
int [] bb = new int[256];
int tt=0;
foreach(int i in gray)
{
gray[i]=0;
}
foreach(int i in rr)
{
rr[i]=0;
}
foreach(int i in gg)
{
gg[i]=0;
}
foreach(int i in bb)
{
bb[i]=0;
}
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
byte red, green, blue;
int nWidth = b.Width;
int nHeight= b.Height;
for(int y=0;y<nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
blue = p[0];
green = p[1];
red = p[2];
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
rr[red]++;
gg[green]++;
bb[blue]++;
gray[tt]++; //统计灰度值为tt的象素点数目
p += 3;
}
p += nOffset;
}
}
all=gray;
rhow=rr;
ghow=gg;
bhow=bb;
b.UnlockBits(bmData);
return true;
}
/*
* 高斯滤波器
*/
public static bool GaussianFilter(Bitmap b,out int[] outGray)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0,b.Width , b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int[] newGray = new int[256];
foreach(int i in newGray)
{
newGray[i]=0;
}
unsafe
{
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
byte * p = (byte *)(void *)Scan0;
byte * pp;
int tt;
int nOffset = stride - b.Width*3;
int nWidth=b.Width;
int nHeight=b.Height;
long sum= 0;
int[,] gaussianMatrix= {{1,2,3,2,1},{2,4,6,4,2},{3,6,7,6,3},{2,4,6,4,2},{1,2,3,2,1}};
for(int y=0;y < nHeight;++y)
{
for(int x=0; x < nWidth; ++x )
{
if(!(x<=1||x>=nWidth-2||y<=1||y>=nHeight-2))
{
pp=p;
sum=0;
int dividend =79;
for(int i = -2;i<= 2;i++)
for(int j = -2;j<= 2;j++)
{
pp+=(j*3+stride*i);
sum+=pp[0]*gaussianMatrix[i+2,j+2];
if (i==0&&j==0)
{
if (pp[0]>240)
{
sum+=p[0]*30;
dividend+=30;
}
else if (pp[0]>230)
{
sum+=pp[0]*20;
dividend+=20;
}
else if (pp[0]>220)
{
sum+=p[0]*15;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -