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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android-如何将RGB彩色图转换为灰度图方法介绍

    实例:RGB2Grey 项目运行效果图:          源代码: [java] public class MainActivity extends Activity { /* (non-Javadoc)     * @see android.app.Activity#onCreate(android.os.Bundle)     */     @Override     public void onCreate(Bundle savedInstanceState) {         sup

  • Android提高之使用NDK把彩图转换灰度图的方法

    一般而言在Android上使用JAVA实现彩图转换为灰度图,与J2ME上的实现方法类似,不过遇到频繁地转换或者是大图转换时,就必须使用NDK来提高速度了.本文主要通过JAVA和NDK这两种方式来分别实现彩图转换为灰度图,并给出速度的对比,供大家参考. 先来简单地介绍一下Android的NDK使用步骤: 以NDK r4为例,或许以后新版的NDK的使用方法略有不同. 1.下载支持C++的android-ndk-r4-crystax,支持C++的话可玩性更强. 2.下载cygwin,选择ftp://m

  • 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 = ne

  • 基于c#图像灰度化、灰度反转、二值化的实现方法详解

    图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些.灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征.图像的灰度

  • python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别

    前言 写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字.字母的组合,国内也有使用汉字的.在这个基础上增加噪点.干扰线.变形.重叠.不同字体颜色等方法来增加识别难度. 相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果

  • python实现图片二值化及灰度处理方式

    我就废话不多说了,直接上代码吧! 集成环境:win10 pycharm #!/usr/bin/env python3.5.2 # -*- coding: utf-8 -*- '''4图片灰度调整及二值化: 集成环境:win10 python3 Pycharm ''' from PIL import Image # load a color image im = Image.open('picture\\haha.png' )#当前目录创建picture文件夹 # convert to grey

  • opencv python如何实现图像二值化

    这篇文章主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白 # 有全局和局部两种 # 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • 关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

    前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图 可以看到左边部分因为整体偏暗,导致二值化后变成全黑,丢失了所有细节,这显然不是我们想要的结果. 原因threshold函数使用一个阈值对图像进行二值化,导致小于这个阈值的像素点全都变成0.因此使用一个阈值的二值化方法并不适用于上面的这张图.那怎么搞? 很明显,上面这张图只有左右两个区域明显亮度不同,最简单的方法就是把图分成两个区域,每个区域分别进行二值化,也就

  • 详解Python+OpenCV实现图像二值化

    目录 一.图像二值化 1.效果 2.源码 二.图像二值化(调节阈值) 1.源码一 2.源码二 一.图像二值化 1.效果 2.源码 import cv2 import numpy as np import matplotlib.pyplot as plt # img = cv2.imread('test.jpg') #这几行是对图像进行降噪处理,但事还存在一些问题. # dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) # plt

  • C#数字图像处理之图像二值化(彩色变黑白)的方法

    本文实例讲述了C#数字图像处理之图像二值化(彩色变黑白)的方法.分享给大家供大家参考.具体如下: //定义图像二值化函数 private static Bitmap PBinary(Bitmap src,int v) { int w = src.Width; int h = src.Height; Bitmap dstBitmap = new Bitmap(src.Width ,src.Height ,System .Drawing .Imaging .PixelFormat .Format24

  • c#实现图片二值化例子(黑白效果)

    C#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: using System; using System.Drawing; namespace BMP2Grey { class Program { static void ToGrey(Bitmap img1) { for (int i = 0; i < img1.Width; i++) { for (int j = 0; j < img1.Height; j++) { Color pixelColor

随机推荐