Mat autoMedFilter(Mat img, int filter_size,int max_filter_size) {
//滤波器尺寸必须是奇数
if ((filter_size % 2) != 1 || filter_size >= img.cols || filter_size >= img.rows)
{
printf("wrong size of the filter");
return img;
}
//获取图片信息
Mat OrignImg = img;
Mat med_filter = Mat(img.size(), CV_8U, Scalar(0));
int width = img.cols;
int hight = img.rows;
//自适应中值滤波
for (int i = ((filter_size - 1) / 2); i < width - ((filter_size -1) / 2); i++) {
for (int j = ((filter_size - 1) / 2); j < hight - ((filter_size-1) / 2); j++)
{
uchar max_pixel = 0;
uchar min_pixel = 255;
int med_pixel = 0;
//存储像素值
std::vector<uchar> filter;
//判断选择合适大小的滤波器
int filter_size_l = filter_size;
do
{
filter.clear();//清空滤波器
for (int k = i - ((filter_size_l - 1) / 2); k <= i + ((filter_size_l - 1) / 2); k++)
for (int m = j - ((filter_size_l - 1) / 2); m <= j + ((filter_size_l - 1) / 2); m++)
{
filter.push_back(OrignImg.at<uchar>(m, k));
}
//找最高最低中值像素,对滤波器内像素排序
for (int fl_i = 0; fl_i < filter.size()-1; fl_i++)
{
int fl_ii = fl_i;
while ((fl_ii >= 0 )&& (filter[fl_ii] > filter[fl_ii + 1]))
{
int temp = filter[fl_ii+1];
filter[fl_ii+1] = filter[fl_ii];
filter[fl_ii] = temp;
fl_ii--;
}
}
max_pixel = filter[filter.size() - 1];
min_pixel = filter[0];
med_pixel = filter[filter.size() / 2];
filter_size_l = filter_size_l + 2;//滤波器尺寸加2
} while (((med_pixel <= min_pixel) || (med_pixel >= max_pixel))&&((filter_size_l < max_filter_size)
&&(filter_size_l<(2*i+1))
&&(filter_size_l<(2*j+1)
&&(filter_size_l < 2*(hight - j))
&& (filter_size_l < 2*(width- i)))));
//
if (OrignImg.at<uchar>(j, i) == min_pixel || max_pixel == OrignImg.at<uchar>(j, i))
{
med_filter.at<uchar>(j, i) = med_pixel;
}
else
med_filter.at<uchar>(j, i) = OrignImg.at<uchar>(j, i);
//med_filter.at<uchar>(j, i) = med_pixel;
}
}
return med_filter;
}
C++自定义自适应中值滤波
最新推荐文章于 2023-03-28 14:21:05 发布