Android实现图像灰度化、线性灰度变化和二值化处理方法

作者:Sakura_echo 时间:2021-10-17 15:49:10 

1、图像灰度化:


public Bitmap bitmap2Gray(Bitmap bmSrc) {
 // 得到图片的长和宽
 int width = bmSrc.getWidth();
 int height = bmSrc.getHeight();
 // 创建目标灰度图像
 Bitmap bmpGray = null;
 bmpGray = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
 // 创建画布
 Canvas c = new Canvas(bmpGray);
 Paint paint = new Paint();
 ColorMatrix cm = new ColorMatrix();
 cm.setSaturation(0);
 ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
 paint.setColorFilter(f);
 c.drawBitmap(bmSrc, 0, 0, paint);
 return bmpGray;
}

2、对图像进行线性灰度变化


public Bitmap lineGrey(Bitmap image) {
 //得到图像的宽度和长度
 int width = image.getWidth();
 int height = image.getHeight();
 //创建线性拉升灰度图像
 Bitmap linegray = null;
 linegray = image.copy(Config.ARGB_8888, true);
 //依次循环对图像的像素进行处理
 for (int i = 0; i < width; i++) {
   for (int j = 0; j < height; j++) {
     //得到每点的像素值
     int col = image.getPixel(i, j);
     int alpha = col & 0xFF000000;
     int red = (col & 0x00FF0000) >> 16;
     int green = (col & 0x0000FF00) >> 8;
     int blue = (col & 0x000000FF);
     // 增加了图像的亮度
     red = (int) (1.1 * red + 30);
     green = (int) (1.1 * green + 30);
     blue = (int) (1.1 * blue + 30);
     //对图像像素越界进行处理
     if (red >= 255)  
     {
       red = 255;
     }

if (green >= 255) {
       green = 255;
     }

if (blue >= 255) {
       blue = 255;
     }
     // 新的ARGB
     int newColor = alpha | (red << 16) | (green << 8) | blue;
     //设置新图像的RGB值
     linegray.setPixel(i, j, newColor);
   }
 }
 return linegray;
}

3、对图像进行二值化


public Bitmap gray2Binary(Bitmap graymap) {
 //得到图形的宽度和长度
 int width = graymap.getWidth();
 int height = graymap.getHeight();
 //创建二值化图像
 Bitmap binarymap = null;
 binarymap = graymap.copy(Config.ARGB_8888, true);
 //依次循环,对图像的像素进行处理
 for (int i = 0; i < width; i++) {
   for (int j = 0; j < height; j++) {
     //得到当前像素的值
     int col = binarymap.getPixel(i, j);
     //得到alpha通道的值
     int alpha = col & 0xFF000000;
     //得到图像的像素RGB的值
     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);
     //对图像进行二值化处理
     if (gray <= 95) {
       gray = 0;
     } else {
       gray = 255;
     }
     // 新的ARGB
     int newColor = alpha | (gray << 16) | (gray << 8) | gray;
     //设置新图像的当前像素值
     binarymap.setPixel(i, j, newColor);
   }
 }
 return binarymap;
}

来源:https://www.jianshu.com/p/bb52bc2143f8?utm_source=tuicool&utm_medium=referral

标签:Android,图像灰度化,线性灰度变化,二值化处理
0
投稿

猜你喜欢

  • Java实现指定线程执行顺序的三种方式示例

    2021-08-16 15:11:34
  • Java面试题冲刺第二十五天--并发编程3

    2023-09-11 04:40:10
  • Java深入学习图形用户界面GUI之事件处理

    2023-11-29 14:14:57
  • zookeeper概述图文详解

    2021-12-07 15:46:03
  • 应用Java泛型和反射导出CSV文件的方法

    2022-02-25 19:50:17
  • Android实现九格智能拼图算法

    2021-11-07 22:40:11
  • Android实现读写USB串口数据

    2023-10-21 19:12:56
  • SpringMVC整合mybatis实例代码

    2022-09-24 08:22:03
  • 浅析Java常用API(Scanner,Random)匿名对象

    2023-05-04 09:42:39
  • Android控件之RatingBar自定义星级评分样式

    2023-12-22 16:03:33
  • Java编程之双重循环打印图形

    2022-02-01 22:06:37
  • Struts2修改上传文件大小限制方法解析

    2023-02-22 21:13:19
  • 判断List和Map是否相等并合并List中相同的Map

    2022-12-29 02:11:10
  • Java 按照字节来截取字符串的代码(不会出现半个汉字)

    2023-04-30 01:40:22
  • 详解C++ bitset用法

    2022-10-30 08:57:16
  • Java提取2个集合中的相同和不同元素代码示例

    2023-11-28 05:48:41
  • Android实现多媒体录音笔

    2022-03-26 17:25:00
  • SpringBoot切面拦截@PathVariable参数及抛出异常的全局处理方式

    2023-05-27 13:59:52
  • Android提高之蓝牙隐藏API探秘

    2022-05-15 03:30:14
  • 解决android.support.v4.content.FileProvide找不到的问题

    2022-09-10 05:42:57
  • asp之家 软件编程 m.aspxhome.com