opencv中用c++实现的中值滤波的算法
这是我最近在学习opencv的过程中,自己实现的中值滤波算法 。由于中值滤波的原理比力简朴,就不再赘述了,下面我只附上代码和效果图,并与opencv自带的函数举行比力。
代码
- #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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |