Java OpenCV 2.4双边过滤

Java OpenCV 2.4双边过滤,java,android,opencv,image-processing,filtering,Java,Android,Opencv,Image Processing,Filtering,在OpenCV android中,是否可以应用双边过滤?我知道我可以做高斯模糊,比如Imgproc.GaussianBlur(灰色,灰色,新尺寸(15,15),0)但我似乎找不到用于双边筛选的代码。似乎可能是这样的: Imgproc.bilateralFilter(mat, dstMat, 10, 50, 0); 来自和 更新 这: 是因为处理Mat的颜色格式错误。您应该将4个通道RGBA格式转换为3个通道RGBforbilateralFilter()apply(如bilateralfilte

在OpenCV android中,是否可以应用双边过滤?我知道我可以做高斯模糊,比如
Imgproc.GaussianBlur(灰色,灰色,新尺寸(15,15),0)但我似乎找不到用于双边筛选的代码。

似乎可能是这样的:

Imgproc.bilateralFilter(mat, dstMat, 10, 50, 0);
来自和

更新

这:

是因为处理
Mat
的颜色格式错误。您应该将4个通道
RGBA
格式转换为3个通道
RGB
for
bilateralFilter()
apply(如
bilateralfilterturial()
方法)。因此,您的代码应该是这样的:

// load Mat from somewhere (e.g. from assets)
mSourceImageMat = Utils.loadResource(this, R.drawable.<your_image>);
// convert 4 channel Mat to 3 channel Mat
Imgproc.cvtColor(mSourceImageMat, mSourceImageMat, Imgproc.COLOR_BGRA2BGR);

// create dest Mat
Mat dstMat = mSourceImageMat.clone();

// apply bilateral filter
Imgproc.bilateralFilter(mSourceImageMat, dstMat, 10, 250, 50);

// convert to 4 channels Mat back
Imgproc.cvtColor(dstMat, dstMat, Imgproc.COLOR_RGB2RGBA);

// create result bitmap and convert Mat to it
Bitmap bm = Bitmap.createBitmap(mSourceImageMat.cols(), mSourceImageMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dstMat, bm);

// show bitmap on ImageView
mImageView.setImageBitmap(bm);
//从某处(例如,从资产)加载Mat
mSourceImageMat=Utils.loadResource(this,R.drawable.);
//将4通道垫转换为3通道垫
Imgproc.cvt颜色(mSourceImageMat、mSourceImageMat、Imgproc.COLOR_BGRA2BGR);
//创建dest Mat
Mat dstMat=mSourceImageMat.clone();
//应用双边滤波器
Imgproc.双边过滤器(mSourceImageMat,dstMat,10250,50);
//转换为4个通道,然后返回
Imgproc.cvtColor(dstMat、dstMat、Imgproc.COLOR_RGB2RGBA);
//创建结果位图并将其转换为Mat
位图bm=Bitmap.createBitmap(mSourceImageMat.cols(),mSourceImageMat.rows(),Bitmap.Config.argb8888);
Utils.matToBitmap(dstMat,bm);
//在ImageView上显示位图
设置图像位图(bm);

问题可能是,您使用的是PNG图像,它有第四个通道用于透明度。使用前,将其从4通道转换为3通道

Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2BGR);

E/AndroidRuntime:FATAL EXCEPTION:Thread-1376进程:PID:30368 CvException[org.opencv.core.CvException:cv::EXCEPTION:/Volumes/build storage/build/2_4_pack-android/opencv/modules/imgproc/src/smooth.cpp:1925:error:(-215)(src.type()=cv| src.type()=cv|8UC1 | src.type()=cv| 8UC3)和src.type==dst.type()=dst.type()=dst.type()=dst.type()&&src.data!=void cv::bilateralFilter_8u函数中的dst.data(常数cv::Mat&,cv::Mat&,int,double,double,int)太好了。我的错误是我使用的是同一个mat,所以检查src.data!=dst.data失败。创建新的mat是必需的bilateralFilter@AndriiOmelchenko谢谢你的回答。不过我有一个问题-为什么你首先使用BGRA2BGR进行频道转换,然后使用RGB2RGBA(我希望你第二次使用BGR2BGRA)。我还不太熟悉opencv,所以我想理解。再次感谢。@noamgot-Hmm,似乎这是我的错误。对于
Imgproc.bilateralFilter()
,重要的是3个通道
Mat
,但通道顺序并不重要(实际上,它只是数字矩阵)。可能使用
BGRA2BGR->BGR2BGRA
会获得更好的结果。
Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2BGR);