![]() | ![]() |
---|---|
原图 | 结果 |
Mat mat4=new Mat();
Mat mat_src=new Mat();
Utils.bitmapToMat(currentBitmap, mat4); //currentBitmap是当前页面中的一个ImageView,需要将其转为Mat类
Utils.bitmapToMat(currentBitmap, mat_src);
Mat element = getStructuringElement(MORPH_RECT, new Size(11,11));//获取卷积核
//下面两个可以合成一个,这里我把它拆分开来了
morphologyEx(mat4,mat4,MORPH_DILATE,element, new Point(-1,-1),1);//膨胀
morphologyEx(mat4,mat4,MORPH_ERODE,element, new Point(-1,-1),1);//腐蚀
mat4=matOperation.minusRGBMat(mat4,mat_src);//这个是我自己写的图像减法操作,用处理后的图减去原图,在下面可以看到
mat4=matOperation.inverseMat(mat4);// 这里是图像颜色反转黑变白,白变黑,自己写的,如下
Bitmap bp4 = Bitmap.createBitmap(mat4.cols(), mat4.rows(), Bitmap.Config.RGB_565);
Utils.matToBitmap(mat4,bp4);
imageView.setImageBitmap(bp4);
mat4.release();
mat_src.release();
两图相减函数
/**
* 对两个RGB图像做减法操作
* @param mat1
* @param mat2
* @return RGB图像
*/
public Mat minusRGBMat(Mat mat1, Mat mat2){
int height=mat1.rows();
int width=mat1.cols();
int channels=mat1.channels();
byte[] values1= new byte[height*width*channels];
byte[] values2= new byte[height* width*channels];
mat1.get(0,0,values1);
mat2.get(0,0,values2);
Mat desMat = new Mat(mat1.rows(), mat1.cols() , CV_8UC4);
for(int i=0; i<values1.length;i++){
if(((values1[i]&0xff)-(values2[i]&0xff))<0){
values1[i]= (byte) ((values1[i]&0xff)%(values2[i]&0xff));
}else {
values1[i]= (byte) ((values1[i]&0xff)-(values2[i]&0xff));
}
}
desMat.put(0,0,values1);
return desMat;
}
白变黑黑变白颜色反转
/**
* 使图片黑白反转
* @param mat
* @return
*/
public Mat inverseMat(Mat mat){
int height=mat.rows();
int width=mat.cols();
Mat desMat = new Mat(height, width, CV_8UC4);
int channels=mat.channels();
Log.v("Picture_attribute","该图像通道数"+channels);
byte[] values = new byte[height*width*channels];
mat.get(0,0,values);
for(int row=0; row<height; row++){
for(int col=0; col<width; col++){
int index=channels*(row*width+col);
values[index]= (255-values[index]&0xff)>0?(byte)(255-values[index]&0xff):values[index];
values[index+1]= (255-values[index+1]&0xff)>0?(byte)(255-values[index+1]&0xff):values[index+1];
values[index+2]= (255-values[index+2]&0xff)>0?(byte)(255-values[index+2]&0xff):values[index+2];
}
}
desMat.put(0, 0, values);
return desMat;
}