Sobel滤波器输出来自opencv和Matlab不同
Sobel filter output from opencv and Matlab different
我正在将一些代码从matlab转换为opencv。我尝试在opencv中使用Sobel,但是opencv和matlab的输出完全不同,这可能是原因。如何使opencv的输出与matlab相同?我的 MATLAB 代码是:
[sobel_edges,T,V,H] = edge(rgb2gray(im),'sobel',0.03);
sobel_angles = atan2(V,H);
sobel_weights = (V.*V+H.*H).^0.5;
其中 0.03 是阈值。在opencv中,当我使用预构建的Sobel滤波器时,输出与matlab完全不同,甚至在openc中计算的engle和幅度也不同。opencv 代码是:
Mat gray_img=Mat::zeros(img.size(),CV_8U);
Mat gradientX=Mat::zeros(gray_img.size(),CV_64F);
Mat gradientY=Mat::zeros(gray_img.size(),CV_64F);
Mat sobel_edge=Mat::zeros(gray_img.size(),CV_64F);
cvtColor(img, gray_img, CV_BGR2GRAY);
Sobel(gray_img, gradientX, gradientX.type(), 1, 0, 3);
Sobel(gray_img, gradientY, gradientY.type(), 0, 1, 3);
Sobel(gray_img,sobel_edge,sobel_edge.type(),1,1,3);
sobel_edge.convertTo(sobel_edge,CV_8U);
sobel_edge.convertTo(sobel_edge,CV_64F);
sobel_edge=sobel_edge/255.0; //I divided this my 255 becuz in MATLAB the output is between 0 to 1
imshow("Sobel",sobel_edge);
Mat magnitude(gray_img.size(), CV_64F, cv::Scalar(0.0));
Mat angles=Mat::zeros(gradientX.size(),CV_64F);
bool anglesInDegrees = true;
cartToPolar(gradientX, gradientY, magnitude, angles, anglesInDegrees);
sobel 边缘本身是不同的,大小和角度也是不同的,我也试图通过查看 matlab 中的边缘函数来手动转换 opencv 中的 sobel,但输出仍然不同,因为事实证明 opencv 的 filter2D 和 matlab 中的 imfilter 返回不同的输出。如何在 matlab 和 opencv 中获得相同的 sobel 输出???手动将 matlab 的 sobel 转换为 opencv 的代码是:
Mat gray_img=Mat::zeros(img.size(),CV_32FC1);
cvtColor(img, gray_img, CV_RGB2GRAY);
double minVal,maxVal;
cv::Mat gray = cv::Mat(gray_img.size(),CV_32FC1);
gray_img.convertTo(gray_img,CV_32FC1);
gray=gray_img/255.0;
cout<<gray<<endl<<"End";
double data[]={1,2,1,0,0,0,-1,2,-1};
Mat op=Mat(3,3,CV_64F,data).clone();
op=op/8;
Mat x_mask;
transpose(op,x_mask);
cout<<x_mask<<endl;
Mat y_mask=op.clone();
int scale=4;
int offset[]={0,0,0,0};
double sobel_thresh=0.03;
Mat bx,by,bx_mul,by_mul,b;
Point anchor(0,0);
float delta = 0.0;
cv::filter2D(gray, bx, CV_32FC1, x_mask, anchor, delta, BORDER_REPLICATE);
bx=abs(bx);
imshow("f1",bx);
cv::filter2D(gray, by, CV_32FC1, y_mask, anchor, delta, BORDER_REPLICATE);
by=abs(by);
imshow("by",by);
pow(bx,2,bx_mul);
imshow("f2",bx_mul);
pow(by,2,by_mul);
b= bx_mul+by_mul;
imshow("f3",b);
double cut_off;
cut_off=pow(sobel_thresh,2);
Mat sobel_edge(gray.size(),CV_32FC1);
for(int i=0;i<b.rows;i++)
{
for(int j=0;j<b.cols;j++)
{
if((b.at<float>(i,j))>cut_off)
{
sobel_edge.at<float>(i,j)=1;
}
else
{
sobel_edge.at<float>(i,j)=0;
}
}
}
imshow("Sobel_edge",sobel_edge);
这段代码给我的结果与 MATLAB 代码相同:
int main(int argc, char* argv[])
{
namedWindow("result");
Mat img=imread("D:\ImagesForTest\1.tiff",0);
img.convertTo(img,CV_32FC1,1.0/255.0);
Mat h,v,g;
cv::Sobel(img,h,-1,1,0,3,1.0/8.0);
cv::Sobel(img,v,-1,0,1,3,1.0/8.0);
cv::magnitude(h,v,g);
// Check extremums
double m,M;
cv::minMaxLoc(g,&m,&M);
cout << m << ":" << M << endl;
cv::minMaxLoc(h,&m,&M);
cout << m << ":" << M << endl;
cv::minMaxLoc(v,&m,&M);
cout << m << ":" << M << endl;
imshow("result",g);
cv::waitKey(0);
}
OpenCV从不扩展卷积结果,所以要小心。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- opencv c++ kmeans 和 matlab kmeans 的不同结果
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- Opencv 平均滤波器提供的输出与 Matlab 平均滤波器不同
- 将 matlab 内联命令转换为不同的
- 我的粒子群优化代码在 C++ 和 MATLAB 中生成不同的答案
- 在 C++ 和 MATLAB 中获取不同的 PGM 像素值结果
- 如何在 Matlab/ C++ 中组合具有不同增益的两个图像
- Sobel滤波器输出来自opencv和Matlab不同
- OpenCV具有与Matlab不同的RGB值
- 不同的像素值在MATLAB和c++与OpenCV
- C编程:将函数从MATLAB转换为C,结果略有不同(但明显不同)
- 犰狳求解(A,b)返回与Matlab,Eigen不同的答案
- Matlab与c++矩阵乘积:相同的输入,不同的输出
- std::exp 给出的结果与复数的 MATLAB exp 不同
- 为什么我的C++ conv函数的输出与conv Matlab调用中的输出不同
- 特征向量和 Matlab 中的不同特征向量和特征值可能会产生错误
- 为什么这个 matlab 和 C++ 代码会产生不同的结果