1. 程式人生 > >matlab中的中值濾波medfilt2()和opencv中的中值濾波medianblur()是不同的

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有差異的情況。而且差異都出現在邊界。