⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filters.cs

📁 C#环境的车牌认别系统源代码和30张测试图片
💻 CS
📖 第 1 页 / 共 3 页
字号:
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 + -