Android实现图像灰度化、线性灰度变化和二值化处理方法
作者:Sakura_echo 发布时间:2021-10-17 15:49:10
标签:Android,图像灰度化,线性灰度变化,二值化处理
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


猜你喜欢
- 服务端注册功能实现通过web层完成客户端和服务端的数据交互(接受数据,发送数据),service层完成业务逻辑(注册,登录),dao层操作数
- 一、开发前准备1. Docker的安装可以参考https://docs.docker.com/install/2. 配置docker远程连接
- 1.什么是串口?在不会使用串口通讯之前,暂且可以把它理解为“一个可通讯的口”;使用篇不深入探讨理论及
- 冒泡排序原理①比较相邻的元素,如果前一个元素比后一个元素大,则交换这两个元素的位置②对每一对相邻的元素循环上面的步骤,最终最后面的元素就是最
- 本文实例为大家分享了Android实现画画板的具体代码,供大家参考,具体内容如下① 准备一个布局文件<?xml version=&qu
- Java继承方法重写是Java语言多态的特性,必须满足以下条件在子类中,方法名称与父类方法名称完全相同方法的参数个数和类型完全相同,返回类型
- 1.本文要解决的问题使用typora打开项目中的md文件2.预期效果选中文件,按下alt+t,调用typora打开此md文件3.IDEA配置
- 前言最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用python、PHP写的那部
- redissonredisson 实现分布式锁的机制如下:依赖版本implementation 'org.redisson:redi
- 一.为什么要用线程池先来看个简单的例子1.直接new Thread的情况:public static void main(String[]
- 结构:安装NuGet包:using SAP.Middleware.Connector;using System.Data;namespace
- 一、使用PinYinConverterCore获取汉语拼音最新在做一个搜索组件,需要使用汉语拼音的首字母查询出符合条件的物品名称,由于汉字存
- 本文实例讲述了Java面向对象程序设计:抽象类,接口用法。分享给大家供大家参考,具体如下:本文内容:抽象类接口抽象类与接口的异同
- 本文结合之前的动态创建fragment来进行一个实践,来实现用Fragment创建一个选项卡项目布局<LinearLayout xml
- 本文实例为大家分享了Android自定义View画圆的具体代码,供大家参考,具体内容如下引入布局<?xml version="
- java list,set,map,数组间的相互转换详解1.list转setSet set = new HashSet( new Array
- 随着互联网的飞跃式发展,移动支付已越来越受欢迎并且已成为常态,很多三方支付公司推出了很多支付方式如快捷支付、认证支付、扫码支付等等。快捷支付
- 最近尝试做了个listview的多选demo,网上看其他人的例子感觉不是很难,自己动手做了下,各种细节问题,没那么简单啊。既然做了,简单写个
- 一、概述顶部ViewPager指示器的字体变色,该效果图是这样的:大概是今天头条的app,神奇的地方就在于,切换ViewPager页面的时候
- 前言有时候可能会遇到需要批量修改文件格式的需求,但百度了很久都没有找到相关的应用什么的,于是学过两天 Android 的我想自己去弄一个 A