问题描述
想用c#编一个可以对图像阈值分割的函数,但是老是运行不正确privatestaticBitmaprobot(BitmapcurBitmap){Rectanglerect=newRectangle(0,0,curBitmap.Width,curBitmap.Height);System.Drawing.Imaging.BitmapDatabmpData=curBitmap.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,curBitmap.PixelFormat);IntPtrptr=bmpData.Scan0;intbytes=curBitmap.Width*curBitmap.Height;byte[]grayValues=newbyte[bytes];System.Runtime.InteropServices.Marshal.Copy(ptr,grayValues,0,bytes);byteT=0,S=0;byte[]neighb=newbyte[bytes];bytetemp=0;bytemaxGray=0;byteminGray=255;int[]countPixel=newint[256];for(inti=0;i<grayValues.Length;i++){temp=grayValues[i];countPixel[temp]++;if(temp>maxGray){maxGray=temp;}if(temp<minGray){minGray=temp;}}doublemu1,mu2;intnumerator;doublesigma;doubletempMax=0;doublew1=0,w2=0;doublesum=0;numerator=0;for(inti=minGray;i<=maxGray;i++){sum+=i*countPixel[i];}for(inti=minGray;i<maxGray;i++){w1+=countPixel[i];numerator+=i*countPixel[i];mu1=numerator/w1;w2=grayValues.Length-w1;mu2=(sum-numerator)/w2;sigma=w1*w2*(mu1-mu2)*(mu1-mu2);if(sigma>tempMax){tempMax=sigma;T=Convert.ToByte(i);}}for(inti=0;i<bytes;i++){if(grayValues[i]<T)grayValues[i]=0;elsegrayValues[i]=255;}System.Runtime.InteropServices.Marshal.Copy(grayValues,0,ptr,bytes);curBitmap.UnlockBits(bmpData);returncurBitmap;}这是程序,处理时总是只能处理上半部分,有没有大神能给改改,或者给一个更好的处理方法。
解决方案
解决方案二:
您忘了每个像素是由三原色组成的
解决方案三:
能具体点吧,没听懂