请选择 进入手机版 | 继续访问电脑版

opencv中用c++实现的中值滤波的算法

[复制链接]
谢世民 发表于 2020-12-31 18:12:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
opencv中用c++实现的中值滤波的算法

这是我最近在学习opencv的过程中,自己实现的中值滤波算法 。由于中值滤波的原理比力简朴,就不再赘述了,下面我只附上代码和效果图,并与opencv自带的函数举行比力。
代码

  1. #include#include#includeusing namespace std;using namespace cv;void salt(Mat& src, Mat& Saltimg, int n);void swap(int& x, int& y);int searchmedia(int* arr, int length);void MediaFilter(Mat& Saltimg, Mat& dst);int main(void){        Mat src = imread("E://图片//kasha.jpg");        if (src.empty())        {                cout  0 && i < dst.rows - 1 && j < dst.cols - 1)                                {                                        arr[0] = Saltimg.at(i - 1, j - 1)[0];                                        arr[1] = Saltimg.at(i - 1, j)[0];                                        arr[2] = Saltimg.at(i - 1, j + 1)[0];                                        arr[3] = Saltimg.at(i, j - 1)[0];                                        arr[4] = Saltimg.at(i, j)[0];                                        arr[5] = Saltimg.at(i, j + 1)[0];                                        arr[6] = Saltimg.at(i + 1, j - 1)[0];                                        arr[7] = Saltimg.at(i + 1, j)[0];                                        arr[8] = Saltimg.at(i + 1, j + 1)[0];                                        dst.at(i, j)[0] = searchmedia(arr, 9);                                        arr[0] = Saltimg.at(i - 1, j - 1)[1];                                        arr[1] = Saltimg.at(i - 1, j)[1];                                        arr[2] = Saltimg.at(i - 1, j + 1)[1];                                        arr[3] = Saltimg.at(i, j - 1)[1];                                        arr[4] = Saltimg.at(i, j)[1];                                        arr[5] = Saltimg.at(i, j + 1)[1];                                        arr[6] = Saltimg.at(i + 1, j - 1)[1];                                        arr[7] = Saltimg.at(i + 1, j)[1];                                        arr[8] = Saltimg.at(i + 1, j + 1)[1];                                        dst.at(i, j)[1] = searchmedia(arr, 9);                                        arr[0] = Saltimg.at(i - 1, j - 1)[2];                                        arr[1] = Saltimg.at(i - 1, j)[2];                                        arr[2] = Saltimg.at(i - 1, j + 1)[2];                                        arr[3] = Saltimg.at(i, j - 1)[2];                                        arr[4] = Saltimg.at(i, j)[2];                                        arr[5] = Saltimg.at(i, j + 1)[2];                                        arr[6] = Saltimg.at(i + 1, j - 1)[2];                                        arr[7] = Saltimg.at(i + 1, j)[2];                                        arr[8] = Saltimg.at(i + 1, j + 1)[2];                                        dst.at(i, j)[2] = searchmedia(arr, 9);                                }                                else                                {                                        dst.at(i, j)[0] = Saltimg.at(i, j)[0];                                        dst.at(i, j)[1] = Saltimg.at(i, j)[1];                                        dst.at(i, j)[2] = Saltimg.at(i, j)[2];                                }                        }        }        else if (dst.channels() == 1)        {                for (int i = 0; i < dst.rows ; i++)                        for (int j =0; j < dst.cols ; j++)                        {                                if (i - 1 > 0 && j - 1 > 0 && i < dst.rows - 1 && j < dst.cols - 1)                                {                                        arr[0] = Saltimg.at(i - 1, j - 1);                                        arr[1] = Saltimg.at(i - 1, j);                                        arr[2] = Saltimg.at(i - 1, j + 1);                                        arr[3] = Saltimg.at(i, j - 1);                                        arr[4] = Saltimg.at(i, j);                                        arr[5] = Saltimg.at(i, j + 1);                                        arr[6] = Saltimg.at(i + 1, j - 1);                                        arr[7] = Saltimg.at(i + 1, j);                                        arr[8] = Saltimg.at(i + 1, j + 1);                                        dst.at(i, j) = searchmedia(arr, 9);                                }                                else                                {                                        dst.at(i, j) = Saltimg.at(i, j);                                }                        }                                        }        dst.copyTo(_dst);        }
复制代码
效果图

原始图

随机加入3000个椒盐噪声图
自己实现的效果图

opencv使用medianBlur函数实现的效果图

总结

程序中的模版是3*3的,如果要用更大的模版,可在程序中自行修改,对灰度图和彩色图都可以滤波。这是本人第一次写博客,写的不对的,请各人指正,一起交换进步。

来源:https://blog.csdn.net/m0_51508490/article/details/111990859
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )