您的位置:首页 > 运维架构

图像处理(二)opencv处理图像二值化,灰度化等

2016-10-24 19:05 274 查看
这里主要实现的 opencv 基于 android 对图像进行常用处理,比如说灰度化,二值化,rgb的转换,这里就不贴主要代码,只是工具代码。

Utils.xxx方法的使用需要在MainActivity.class中添加此方法(好像是掉用opencv,android手机首次使用需要下载):

//OpenCV库加载并初始化成功后的回调函数
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status){
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "成功加载");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
break;
}

}
};
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//load OpenCV engine and init OpenCV library
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, getApplicationContext(), mLoaderCallback);
Log.i(TAG, "onResume sucess load OpenCV...");
//      new Handler().postDelayed(new Runnable(){
//
//          @Override
//          public void run() {
//              // TODO Auto-generated method stub
//              procSrc2Gray();
//          }
//
//      }, 1000);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


Utils(处理方法)

//灰度化
public Bitmap procSrc2Gray(Bitmap bm){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
Bitmap graybm = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);  //创建图像
Utils.bitmapToMat(bm, rgbMat);//bitmap转RGB,常用
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, graybm);
return graybm;
}

//(额外附上bitmap的处理方法)灰度化
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;
}
//旋转
public Bitmap rotaingImageView(int angle , Bitmap bitmap) {
//旋转图片 动作
Matrix matrix = new Matrix();
matrix.postRotate(angle);
// 创建新的图片
Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return bm;
}

//RGB转换
public Bitmap transparentImage(Bitmap bm){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
double[] data = {250,250,250,250};//data即颜色
Bitmap graybm = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
Utils.bitmapToMat(bm, rgbMat);
for(int i=0;i<rgbMat.rows();i++) {
for(int j=0;j<rgbMat.cols();j++) {
rgbMat.put(i, j, data);
}
}
Utils.matToBitmap(rgbMat, graybm);
return graybm;
}

//(额外附上bitmap方法)RGB转换
public Bitmap transparentImage(Bitmap bmp) {

/*       pixels      接收位图颜色值的数组
offset      写入到pixels[]中的第一个像素索引值
stride      pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数
x                  从位图中读取的第一个像素的x坐标值。
y           从位图中读取的第一个像素的y坐标值
width      从每一行中读取的像素宽度
height    读取的行数
*/
int m_ImageWidth, m_ImageHeigth;
m_ImageWidth = bmp.getWidth();
m_ImageHeigth = bmp.getHeight();
m_BmpPixel = new int[m_ImageWidth * m_ImageHeigth];
bmp.getPixels(m_BmpPixel, 0, m_ImageWidth, 0, 0, m_ImageWidth,
m_ImageHeigth);
System.out.println("AAAAAAAAAAAA2");
for (int i = 0; i < m_ImageWidth * m_ImageHeigth; i++) {
if (m_BmpPixel[i] == Color.WHITE) {
m_BmpPixel[i] = Color.BLACK;
}
}
System.out.println("AAAAAAAAAAAA3");
Bitmap pro = Bitmap.createBitmap(m_ImageWidth,m_ImageHeigth, Bitmap.Config.ARGB_8888);
pro.setPixels(m_BmpPixel, 0, m_ImageWidth, 0, 0, m_ImageWidth,
m_ImageHeigth);
System.out.println("AAAAAAAAAAAA4");
return pro;

}

//二值化
/*
名称                  常量
二值阈值化       Imgproc.THRESH_BINARY
阈值化到零       Imgproc.THRESH_TOZERO
截断阈值化       Imgproc.THRESH_TRUNC
反转二值阈值化 Imgproc.THRESH_BINARY_INV
反转阈值化到零 Imgproc.THRESH_TOZERO_INV
*/
public Bitmap changeBitmap(Bitmap bm) {
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
Utils.bitmapToMat(bm,rgbMat);
Imgproc.threshold(rgbMat,grayMat,100,255,Imgproc.THRESH_BINARY);
Utils.matToBitmap(grayMat,bm);
return bm;
}

//(额外附上bitmap方法)二值化
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: