如何将一张彩色图片转换成黑白的灰度图片呀,在android下实现 ,希望有知道算法的朋友告诉我下,谢谢

解决方案 »

  1.   

    http://blog.csdn.net/chenamo9651/archive/2006/07/07/886749.aspx
      

  2.   

    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;import javax.imageio.ImageIO;public class Binary {public static void main(String[] args) throws IOException {
    Image imagesoure=new Image();
    System.out.println("This is the end");}}
    class Image
    {
    int width;
    int height;
    int area = width*height;
    //BufferedImage outBinary=img;
    public Image() throws IOException
    {
    File file =new File("F:/4.jpg");
    BufferedImage img=ImageIO.read(file);
    BufferedImage outBinary=img;
    width=img.getWidth();
    height=img.getHeight();
    int area = width*height;
    int gray[][]=new int[width][height];
    int u=0;//灰度平均值
    int graybinary;
    int graysum=0;
    int graymean=0;
    int grayfrontmean=0;
    int graybackmean=0;
    Color color;
    int pixl[][]=new int[width][height];
    int pixelsR;
    int pixelsG;
    int pixelsB;
    int pixelGray;
    int T=0;
    int front=0;
    int back=0;
    for(int i = 1; i < width ; i++) {        //不算边界行和列,为避免越界
          for(int j = 1; j < height ; j++) 
          {
          pixl[i][j]=img.getRGB(i, j);
          color = new Color(pixl[i][j]);
          pixelsR = color.getRed();//R空间
          pixelsB =color.getBlue();//G空间
              pixelsG =color.getGreen();//B空间
      pixelGray=(int)(0.3*pixelsR+0.59*pixelsG+0.11*pixelsB);//计算每个坐标点的灰度
              gray[i][j]=(pixelGray<<16)+(pixelGray<<8)+(pixelGray);
      graysum+=pixelGray;
    }
          
    }
    graymean=(int)(graysum/area);//整个图的灰度平均值
    u=graymean;
    System.out.println(u);for(int i=0;i<width;i++)   //计算整个图的二值化阈值
    {
    for(int j=0;j<height;j++)
    {
    if(((gray[i][j])&(0x0000ff))<graymean)
    {
    graybackmean+=((gray[i][j])&(0x0000ff));
    back++;
    }else
    {
    grayfrontmean+=((gray[i][j])&(0x0000ff));
    front++;
    }
    }
    }
    int frontvalue=(int)(grayfrontmean/front);//前景中心
    int backvalue=(int)(graybackmean/back);//背景中心
    float G[]=new float[frontvalue-backvalue+1];//方差数组
    int s=0;
    System.out.println(front);
    System.out.println(frontvalue);
    System.out.println(backvalue);
    for(int i1=backvalue;i1<frontvalue+1;i1++)//以前景中心和背景中心为区间采用大津法算法
    {
    back=0;
    front=0;
    grayfrontmean=0;
    graybackmean=0;
    for(int i=0;i<width;i++)
        {
    for(int j=0;j<height;j++)
        {
        if(((gray[i][j])&(0x0000ff))<(i1+1))
        {
        graybackmean+=((gray[i][j])&(0x0000ff));
        back++;
        }else
        {
        grayfrontmean+=((gray[i][j])&(0x0000ff));
        front++;
       
        }
        }
        }
        grayfrontmean=(int)(grayfrontmean/front);
        graybackmean=(int)(graybackmean/back);
       
        G[s]=(((float)back/area)*(graybackmean-u)*(graybackmean-u)+((float)front/area)*(grayfrontmean-u)*(grayfrontmean-u));
        s++;
    }
    float max=G[0];
    int index=0;
    for(int i=1;i<frontvalue-backvalue+1;i++)
    {
    if(max<G[i])
    {
    max=G[i];
    index=i;
    }
    }
    //System.out.println(G[index]);
    //System.out.println(index);
    for(int i=0;i<width;i++)
    {
    for(int j=0;j<height;j++)
    {
    if(((gray[i][j])&(0x0000ff))<(index+backvalue))
    {
    outBinary.setRGB(i,j,0x000000);
    }else
    {
    outBinary.setRGB(i,j,0xffffff);
    }
    }
    }
    File f=new File("F:/4color-imageBinary.jpg");
    ImageIO.write(outBinary, "jpg", f);
    }
    }
      

  3.   

    Android没有对针对图片处理的接口。
    图像二值画用0,1表示的算法和c c++ java 实现方案很多,封装一下调用现成
      

  4.   

    在android平台下 没有java.awt这个包了
      

  5.   

    不要这么较真么,,只是给你贴了一个java的类似代码。java遇到android上不要太简单。
      

  6.   

    public static Bitmap toGrayscale(Bitmap bmpOriginal)
        {        
            int width, height;
            height = bmpOriginal.getHeight();
            width = bmpOriginal.getWidth();            Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            Canvas c = new Canvas(bmpGrayscale);
            Paint paint = new Paint();
            ColorMatrix cm = new ColorMatrix();
            cm.setSaturation(0);
            ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
            paint.setColorFilter(f);
            c.drawBitmap(bmpOriginal, 0, 0, paint);
            return bmpGrayscale;
        }
      

  7.   

    这个没这么复杂
    用上面的代码就行了
    有事加QQ群80979705专门研究 android和IOS的游戏与应用的实现方案