如何实现imgradient()MATLAB的功能的OpenCV的Android的Java [英] how to implement imgradient() function of matlab in opencv android java
问题描述
我想使用 imgradient()
使用 MATLAB
的功能在我的Android应用程序 OpenCV的。
我怎么可以这样做,哪些功能 OpenCV的
相当于Matlab的 imgradient()
功能。
读音字使用下述函数是不是?
公共垫imgradient(太grayScaleImage)
{
垫grad_x =新垫();
垫grad_y =新垫();
太abs_grad_x =新垫();
太abs_grad_y =新垫();
垫gradientImag =新垫(grayScaleImage.rows(),grayScaleImage.cols(),CvType.CV_8UC1); Imgproc.Sobel(grayScaleImage,grad_x,CvType.CV_16S,1,0,3,1,0,Imgproc.BORDER_DEFAULT);
Core.convertScaleAbs(grad_x,abs_grad_x);
Imgproc.Sobel(grayScaleImage,grad_y,CvType.CV_16S,0,1,3,1,0,Imgproc.BORDER_DEFAULT);
Core.convertScaleAbs(grad_y,abs_grad_y);
双[] = buff_grad新的双[1];
的for(int i = 0; I< abs_grad_y.cols();我++)
{
对于(INT J = 0; J< abs_grad_y.rows(); J ++)
{
双[] = buff_x abs_grad_x.get(J,I);
双[] = buff_y abs_grad_y.get(J,I);
双X = buff_x [0];
双Y = buff_y [0];
双ANS = 0;
尝试
{
ANS =的Math.sqrt(Math.pow(X,2)+ Math.pow(Y,2));
}赶上(NullPointerException异常E)
{
ANS = 0; }
buff_grad [0] = ANS;
gradientImag.put(J,I,buff_grad);
}
}
返回gradientImag;
}
作为MATLAB imgradient()返回每个梯度幅度(即的sqrt(DX(X,Y)2 + DY(X,Y)2)与坐标x,y)像素,你可能想要做的是这样的:
// 1)取得水平梯度
垫的kH =(CV :: Mat_<双>(1,3)<< -1,0,1); // x中差内核
垫霉素;
filter2D(图像,DX,-1,KH,CV ::点(-1,-1),0);// 2)取得垂直梯度
垫千伏=(CV :: Mat_<双>(3,1)LT;< -1,0,1); y中//差内核
垫镝;
filter2D(图像,镝,-1,千伏,CV ::点(-1,-1),0);// 3)中的每个点获取的sqrt(dx²+dy²)
的for(int i = 0; I< Dx.rows;我++)
对于(INT J = 0; J< Dx.cols; J ++)
Dmag.at<双>(I,J)=开方(POW(Dx.at<双>(I,J),2)+ POW(Dy.at<双>(I,J),2));
它应该让你你想要的东西。可以通过访问坡度数据,而不是使用.AT(I,J)为每个像素实现更好的性能。
希望它帮助!
I want to use the imgradient()
function of matlab
in my android application using opencv.
how can i do so and which function of opencv
is equivalent to to Matlab imgradient()
function.
i m using below mentioned function is it right ?
public Mat imgradient(Mat grayScaleImage)
{
Mat grad_x=new Mat();
Mat grad_y = new Mat();
Mat abs_grad_x=new Mat();
Mat abs_grad_y=new Mat();
Mat gradientImag = new Mat(grayScaleImage.rows(),grayScaleImage.cols(),CvType.CV_8UC1);
Imgproc.Sobel(grayScaleImage, grad_x, CvType.CV_16S, 1, 0,3,1,0,Imgproc.BORDER_DEFAULT );
Core.convertScaleAbs( grad_x, abs_grad_x );
Imgproc.Sobel( grayScaleImage, grad_y, CvType.CV_16S, 0, 1, 3, 1,0,Imgproc.BORDER_DEFAULT );
Core.convertScaleAbs( grad_y, abs_grad_y );
double[] buff_grad = new double[1];
for(int i = 0; i < abs_grad_y.cols(); i++)
{
for(int j =0 ; j<abs_grad_y.rows() ; j++)
{
double[] buff_x = abs_grad_x.get(j, i);
double[] buff_y = abs_grad_y.get(j, i);
double x = buff_x[0];
double y = buff_y[0];
double ans=0;
try
{
ans = Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
}catch(NullPointerException e)
{
ans = 0;
}
buff_grad[0] = ans;
gradientImag.put(j, i, buff_grad);
}
}
return gradientImag;
}
As matlab imgradient() returns the gradient "magnitude" (i.e. sqrt(dx(x,y)² + dy(x,y)²) for each pixel with coordinates x,y), you may want to do something like:
// 1) Get the horizontal gradient
Mat kH = (cv::Mat_<double>(1,3) << -1,0,1); // differential kernel in x
Mat Dx;
filter2D(image, Dx, -1, kH, cv::Point(-1,-1), 0);
// 2) Get the vertical gradient
Mat kV = (cv::Mat_<double>(3,1) << -1,0,1); // differential kernel in y
Mat Dy;
filter2D(image, Dy, -1, kV, cv::Point(-1,-1), 0);
// 3) Get sqrt(dx²+dy²) in each point
for(int i=0; i<Dx.rows; i++)
for(int j=0; j<Dx.cols; j++)
Dmag.at<double>(i,j) = sqrt(pow(Dx.at<double>(i,j),2)+pow(Dy.at<double>(i,j),2));
It should get you what you you want. You can achieve a better performance by accessing gradient data instead of using .at(i,j) for each pixel.
Hope it helps!
这篇关于如何实现imgradient()MATLAB的功能的OpenCV的Android的Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!