当我应用这样的中值滤波器时:
Mat medianFilter;
medianBlur(histEqu, medianFilter, 3);
如果我应用中值滤波器,我会期望相同的结果:
Mat manualMedianFiler;
float factor = 1 / 9.0;
Mat kernelMedian = (Mat_<float>(3, 3) <<
factor, factor, factor,
factor, factor, factor,
factor, factor, factor);
filter2D(histEqu, manualMedianFiler, CV_8U, kernelMedian, Point(-1,-1), 0, 4);
结果矩阵是相似的,但它们不相等。 难道我做错了什么?应用中值滤波器的正确方法是什么?
答案 0 :(得分:4)
您的manualMedianFilter
不是中位数过滤器,而是卑鄙的过滤器,对应cv::boxFilter
。
答案 1 :(得分:4)
作为@Miki答案的补充,我提醒你,中值滤波器是给出N个样本(在这种情况下取自中心像素周围的3x3平方)的中值滤波器对它们的值进行排序并将中间值过滤掉。所以给出(1,7,2,2,1,9,24,4,5)后,得到(1,1,2,2,4,5,7,9,22),中位数为4,而平均值是(1 + 7 + 2 + 2 + 1 + 9 + 22 + 4 + 5)/ 9 = 53/9 - > 5.8。
简而言之:中值滤波器不是线性的。
在想要移除尖峰的地方首选中位数过滤器。
答案 2 :(得分:-1)
这里有一个简单的:
void MedianFilter()
{
Mat image= imread("C:\\Users\\User\\Desktop\\10.jpg", 1);
Mat image1;
cvtColor(image, image1, COLOR_BGR2GRAY);
imshow("testx", image1);
uchar * data = image1.data;
vector<int> values;
for (auto index = 0; index < (image1.rows*image1.cols); index++)
{
for (size_t i = 0; i < 13; i++) \\ 13 is the element to get the median from...
{
values.push_back(data[index + i]);
}
std::sort(values.begin(), values.end());
image1.data[index] = values[6]; // 6 is the median of 13 plus the index number (0-6) ...
values.clear();
}
imshow("test", image1);
waitKey(0);
}