C++ 实现matlab中值滤波函数medfilt2

void MedianFilt(std::vector<int> src, std::vector<int> dst, MatrixParam& param, int kernel_height, int kernel_width)
{
    // 将一维数组转换为二维数组
    int** src_2d = new int* [param.NRow()];

    for (int i = 0; i < param.NRow(); i++)
    {
        src_2d[i] = new int[param.NCol()];
        for (int j = 0; j < param.NCol(); j++)
        {
            src_2d[i][j] = src[i * param.NCol() + j];
        }
    }

    // 创建中值滤波移动窗口
    int* medianWindow = new int[kernel_height * kernel_width]{ 0 };

    //数据边界复制填充
    int a = param.NRow() + (kernel_height - 1);
    int b = param.NCol() + (kernel_width - 1);
    int** newSrc = new int* [a];
    for (int i = 0; i < a; i++)
    {
        newSrc[i] = new int[b] {0};
    }

    // 复制中间部分数据
    for (int i = ((kernel_height - 1) / 2); i < (a - (kernel_height - 1) / 2); i++)
    {
        for (int j = ((kernel_width - 1) / 2); j < (b - (kernel_width - 1) / 2); j++)
        {
            newSrc[i][j] = src_2d[i - (kernel_height - 1) / 2][j - (kernel_width - 1) / 2];
        }
    }

    // 中值滤波   
    for (int i = ((kernel_height - 1) / 2); i < (a - (kernel_height - 1) / 2); i++)
    {
        for (int j = ((kernel_width - 1) / 2); j < (b - (kernel_width - 1) / 2); j++)
        {
            int k = 0;
            // get the elements of median kernel from window
            for (int ii = (i - ((kernel_height - 1) / 2)); ii < ((i + (kernel_height - 1) / 2) + 1); ii++)
            {
                for (int jj = (j - ((kernel_width - 1) / 2)); jj < ((j + (kernel_width - 1) / 2) + 1); jj++)
                {
                    
                    medianWindow[k] = newSrc[ii][jj];
                    k++;
                }
            }
            // sort elements(only half of them)
            for (int m = 0; m < (kernel_height * kernel_width + 1) / 2; m++)
            {             
                for (int n = m + 1; n < (kernel_height * kernel_width); n++)
                {
                    if (medianWindow[n] < medianWindow[m])
                    {
                        // put found minimum element in its place
                        float temp = medianWindow[m];
                        medianWindow[m] = medianWindow[n];
                        medianWindow[n] = temp;
                    }
                }
            }
            dst[(i - (kernel_height - 1) / 2) * param.NCol() + (j - (kernel_width - 1) / 2)] = medianWindow[(kernel_height * kernel_width - 1) / 2];          
        }
    }

    for (int i = 0; i < param.NRow(); i++)
    {
        delete[] src_2d[i];
        src_2d[i] = NULL;
    }
    delete[] src_2d;
    src_2d = NULL;

    delete[] medianWindow;
    medianWindow = NULL;

    for (int i = 0; i < a; i++)
    {
        delete[] newSrc[i];
        newSrc[i] = NULL;
    }
    delete[] newSrc;
    newSrc = NULL;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MATLAB中的中值滤波函数是'medfilt2'。该函数用于对二维图像进行中值滤波,即将每个像素的值替换为该像素周围邻域内像素的中值。 下面是一个示例代码,可以演示如何使用'medfilt2'函数对图像进行中值滤波处理: A = rgb2gray(imread('cameraman.png')); % 读取一张灰度图像 B = medfilt2(A, [3 3], 'symmetric'); % 对图像进行中值滤波 figure, imshow(A), title('Original Image'); % 显示原图 figure, imshow(B), title('Filtered Image'); % 显示滤波后的图像 另外,还可以使用以下代码进行中值滤波处理: x=imread('G:\matlab\1.jpg');% 需要过滤的图像 n=3; % 模板大小 [height, width]=size(x); % 获取图像的尺寸 figure; imshow(x);% 显示原图 x = imnoise(x,'salt & pepper'); % 加入椒盐噪声 figure; imshow(x); % 显示加噪声后的图像 x1=double(x); % 数据类型转换 x2=x1; % 转换后的数据赋给x2 for i=1:height-n+1 for j=1:width-n+1 c=x1(i:i+n-1,j:j+n-1); % 在x1中取模板大小的块赋给c e=c(1,:); % e中存放c矩阵的第一行 for u=2:n % 将c中的其他行元素取出来接在e后使e为一个行矩阵 e=[e,c(u,:)]; end med=median(e); % 取一行的中值 x2(i+(n-1)/2,j+(n-1)/2)=med; % 将模板各元素的中值赋给模板中心位置的元素 end end d=uint8(x2); % 未被赋值的元素取原值 figure; imshow(d); % 显示过滤图像 x0=rgb2gray(x); % 灰度处理,得到二维矩阵 b=medfilt2(x0,[n,n]); % 使用'medfilt2'函数进行中值滤波 figure; imshow(b); % 显示滤波后的灰度图像<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Matlab中值滤波](https://blog.csdn.net/CC_Lsh/article/details/130166797)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [中值滤波matlab)](https://blog.csdn.net/qq_43211132/article/details/87455793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值