影象處理(二)opencv處理影象二值化,灰度化等
阿新 • • 發佈:2019-01-01
這裡主要實現的 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;
}