matlab中的中值滤波medfilt2()和opencv中的中值滤波medianblur()是不同的

matlab中的中值滤波medfilt2()和opencv中的中值滤波medianblur()做出的结果不同,如图所示:
Opencv处理结果如下:
在这里插入图片描述
Matlab处理结果如下:
在这里插入图片描述
Opencv处理过程中的程序代码:
float aa[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
CvMat temp = cvMat(4, 4, CV_32FC1, &aa);
printf(“原矩阵:\n”);
printarry(&temp);
CvMat*dat = cvCreateMat(4, 4, CV_32FC1);
cvSmooth(&temp, dat, CV_MEDIAN, 3, 3);
printf(“处理后矩阵:\n”);
printarry(dat);
其中cvSmooth()实际调用的就是medianblur函数,有图有真相,源码如下:
在这里插入图片描述
那么为什么处理的结果不同呢?
原因是由于medfilt2(Z, [3 3])默认边界是用0填充,这就使得最后边界的像素可能为0,出现上述图中四个角点为0的情况。
而cvSmooth默认的在模板处理时,边界用复制的方式来填充,所以出现了和matlab有差异的情况。而且差异都出现在边界。

猜你喜欢

转载自blog.csdn.net/zhengxinjie2/article/details/84944163