android图像处理之灰度化

package com.scy.grayvalue2;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;

/**
 * 思路如下:
 
     1.读取or照相,得到一张ARGB图片。
 
     2.转化为bitmap类,并对其数据做如下操作:
 
        A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值新R,G,B值为X,即:
 
        new_R = X, new_G = X, new_B = X
 
        例如:原来一个像素是4个byte,分别为ARGB,现在这个像素应该为AXXX。
 
      3.将上一步骤得到的bitmap图像写到输出流里面,并保存为图片。或者直接显示在ImageView上。

 * @author scy
 *
 */
public class MainActivity extends Activity 
{
	private byte[] rawData;
	private ImageView imageView;
	
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.image);
        //将bitmap转换成一个伪灰度图,再转化成一个byte[]
        //将byte[]转换为bitmap
//		Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length);
        Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
		Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); 
		//Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true);
		if(bitmapNew == null)
			Log.i("TAG", "null");
		Log.i("TAG", "copy end");
		/**
		 * 一种简单的灰度化算法,但是这种方法需要修改每个点的像素,如果一张图片比较大,则这个处理速度就堪忧了
		 * 往往需要创建一个线程来处理
		 */
        for(int i = 0;i<bitmapNew.getWidth();i++)
        {
      	  for(int j =0;j<bitmapNew.getHeight();j++)
      	  {	
                int col = bitmapNew.getPixel(i, j);//获取点(i,j)处的像素
                //分别获取ARGB的值
                int alpha = col&0xFF000000;
                int red = (col&0x00FF0000)>>16;
                int green = (col&0x0000FF00)>>8;
                int blue = (col&0x000000FF);
                //用公式X = 0.3×R+0.59×G+0.11×B计算出X代替原来的RGB
                int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
                //新的ARGB
                int newColor = alpha|(gray<<16)|(gray<<8)|gray;
                //在点(i,j)处设置新的像素
                bitmapNew.setPixel(i, j, newColor);
                //Log.v("tag",  Integer.toHexString(col));  
      	  }
        }
        Log.i("TAG", "pro end");
        sendMsg(bitmapNew);
        /*
        File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg");
        OutputStream out;
		try {
			out = new FileOutputStream(file);
			if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out))
				Log.i("TAG", "success");
			out.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		*/
	}

	private void sendMsg(Bitmap bitmapNew)
	{
		imageView.setImageBitmap(bitmapNew);
	}
}

/**
 * drawableToBitmap
 */
/*
 public static Bitmap drawableToBitmap(Drawable drawable) {
        
        Bitmap bitmap = Bitmap
                        .createBitmap(
                                        drawable.getIntrinsicWidth(),
                                        drawable.getIntrinsicHeight(),
                                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                                        : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        //canvas.setBitmap(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
}
 */

/**
 * Bitmap2Bytes
 */
/*
 private byte[] Bitmap2Bytes(Bitmap bm)
 {
	ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
	bm.compress(Bitmap.CompressFormat.PNG, 100, baos); 
 	return baos.toByteArray();
 }
*/

/**
 * Bytes2Bimap
 */
/*
 private Bitmap Bytes2Bimap(byte[] b)
 {
    if(b.length ==0)
    {
    	return null;
    }

	return BitmapFactory.decodeByteArray(b, 0, b.length);

  }
*/


最后介绍了几种图片转换方法。

下面是另外一种灰度化方法:

package com.scy.grayvalue;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.view.Menu;
import android.widget.ImageButton;
import android.widget.ImageView;

public class MainActivity extends Activity  
{
	private Bitmap bitmap,buffer;
	private ImageView imageView;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);      
           
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        buffer = convert2Gray(bitmap);
       /*
        //创建八位图
        buffer = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
        //将八位图作为画布
        Canvas canvas = new Canvas(buffer);
        Paint paint = new Paint();

        paint.setColorFilter(filter);
        
        canvas.drawBitmap(buffer, 0, 0, paint);
        canvas.save();
         */
        imageView = (ImageView)findViewById(R.id.image);
        imageView.setImageBitmap(buffer);
 
        /*
        File file = new File("/mnt/1.jpg");
        FileOutputStream os = null;
        try
		{
			os = new FileOutputStream(file);
			bitmap.compress(Bitmap.CompressFormat.JPEG, 80, os);
			os.flush();
			os.close();
		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		*/
        
        
    }
	private Bitmap convert2Gray(Bitmap bitmap)
	{
        /**
         *  [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ] When applied to a color [r, g, b, a], 
         *  the resulting color is computed as (after clamping) 
         *  R' = a*R + b*G + c*B + d*A + e; G' = f*R + g*G + h*B + i*A + j; 
         *  B' = k*R + l*G + m*B + n*A + o; A' = p*R + q*G + r*B + s*A + t; 
         */
        ColorMatrix colorMatrix = new ColorMatrix();
        /**
         * Set the matrix to affect the saturation(饱和度) of colors. 
         * A value of 0 maps the color to gray-scale(灰阶). 1 is identity
         */
        colorMatrix.setSaturation(0);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
        
        Paint paint = new Paint();
        paint.setColorFilter(filter);
        
        Bitmap result = bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(bitmap, 0, 0, paint);
        return result;
	}

}


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio中进行图像灰度化和二值化处理可以通过以下步骤实现: 1. 导入图像:首先,你需要将要处理的图像导入到Android Studio项目中。可以将图像文件放置在项目的资源文件夹(例如res/drawable)中。 2. 加载图像:使用Bitmap类加载图像文件,并将其显示在ImageView或其他视图组件上。可以使用以下代码加载图像: ```java Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); imageView.setImageBitmap(imageBitmap); ``` 3. 图像灰度化处理:将彩色图像转换为灰度图像。可以使用以下代码实现: ```java Bitmap grayBitmap = Bitmap.createBitmap(imageBitmap.getWidth(), imageBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(grayBitmap); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); // 设置饱和度为0,实现灰度化 Paint paint = new Paint(); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(filter); canvas.drawBitmap(imageBitmap, 0, 0, paint); imageView.setImageBitmap(grayBitmap); ``` 4. 图像二值化处理:将灰度图像转换为二值图像,即将灰度值大于某个阈值的像素设为白色,小于等于阈值的像素设为黑色。可以使用以下代码实现: ```java int threshold = 128; // 阈值 int width = grayBitmap.getWidth(); int height = grayBitmap.getHeight(); int[] pixels = new int[width * height]; grayBitmap.getPixels(pixels, 0, width, 0, 0, width, height); for (int i = 0; i < pixels.length; i++) { int gray = Color.red(pixels[i]); if (gray > threshold) { pixels[i] = Color.WHITE; } else { pixels[i] = Color.BLACK; } } Bitmap binaryBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); binaryBitmap.setPixels(pixels, 0, width, 0, 0, width, height); imageView.setImageBitmap(binaryBitmap); ``` 这样,你就可以在Android Studio中实现图像灰度化和二值化处理了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值