matlab soble滤波,c – 来自opencv和Matlab的Sobel滤波器输出不同

我正在将一些代码从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输出?将slab of matlab手动转换为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<

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<

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

{

for(int j=0;j

{

if((b.at(i,j))>cut_off)

{

sobel_edge.at(i,j)=1;

}

else

{

sobel_edge.at(i,j)=0;

}

}

}

imshow("Sobel_edge",sobel_edge);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值