滤波算法(3)
来源:互联网 发布:安迅网络 编辑:程序博客网 时间:2024/06/06 20:02
保护带均值
void cmean(Mat src, Mat dst, int innerbox_size, int outerbox_size) //innerbox_size, outerbox_size均为奇数{if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){return;}//unsigned short centerpix;uchar centerpix;//vector<unsigned short> tempdata;vector<uchar> tempdata;tempdata.clear();//vector<unsigned short> tempdata2;vector<uchar> tempdata2;tempdata2.clear();int i = 0, j = 0, k = 0, l = 0;//循环变量int height, width, step;int inner_kernel_size = 0;int outer_kernel_size = 0;height = src.rows;width = src.cols;if (innerbox_size % 2 == 0){inner_kernel_size = innerbox_size / 2;outer_kernel_size = outerbox_size / 2;}else{inner_kernel_size = (innerbox_size - 1) / 2;outer_kernel_size = (outerbox_size - 1) / 2;}for (i = outer_kernel_size; i < height - outer_kernel_size; i++){/*unsigned short* data = src.ptr<unsigned short>(i);unsigned short* datadst = dst.ptr<unsigned short>(i);*/uchar* data = src.ptr<uchar>(i);uchar* datadst = dst.ptr<uchar>(i);for (j = outer_kernel_size; j < width - outer_kernel_size; j++){centerpix = data[j];tempdata.clear();tempdata2.clear();if (centerpix != 0){//计算保护带内像素值之和for (l = i - inner_kernel_size; l <= i + inner_kernel_size; l++){//unsigned short* datatemp = src.ptr<unsigned short>(l);uchar* datatemp = src.ptr<uchar>(l);for (k = j - inner_kernel_size; k <= j + inner_kernel_size; k++){tempdata.push_back(datatemp[k]);}}//计算大滤波框内像素值之和for (l = i - outer_kernel_size; l <= i + outer_kernel_size; ++l){//unsigned short* datatemp2 = src.ptr<unsigned short>(l);uchar* datatemp2 = src.ptr<uchar>(l);for (k = j - outer_kernel_size; k <= j + outer_kernel_size; k++){tempdata2.push_back(datatemp2[k]);}}size_t tempvec = tempdata.size(); //保护带内像素个数size_t tempvec2 = tempdata2.size(); //大滤波框内像素个数//unsigned short tempsum = 0, tempsum2 = 0; //分别表示,保护带内像素值之和;大滤波框内像素值之和int tempsum = 0, tempsum2 = 0;int count = 0, count2 = 0; //滤波框子里非零项个数for (size_t tempi = 0; tempi < tempvec; tempi++){tempsum += tempdata[tempi];if (tempdata[tempi] != 0) count++;}for (size_t tempi = 0; tempi < tempvec2; tempi++){tempsum2 += tempdata2[tempi];if (tempdata2[tempi] != 0) count2++;}tempsum2 = tempsum2 - tempsum;if (count2 == count) datadst[j] = 0;else{//unsigned short background = tempsum2 / (count2 - count);uchar background = tempsum2 / (count2 - count);datadst[j] = background;}}else{datadst[j] = 0;}}}return;}保护带中值
void cmedian(Mat src, Mat dst, int innerbox_size, int outerbox_size) //innerbox_size, outerbox_size均为奇数{if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){return;}//unsigned short centerpix;uchar centerpix;vector<uchar> dataForsort;dataForsort.clear();int i = 0, j = 0, k = 0, l = 0;//循环变量int height, width, step;int inner_kernel_size = 0;int outer_kernel_size = 0;height = src.rows;width = src.cols;if (innerbox_size % 2 == 0){inner_kernel_size = innerbox_size / 2;outer_kernel_size = outerbox_size / 2;}else{inner_kernel_size = (innerbox_size - 1) / 2;outer_kernel_size = (outerbox_size - 1) / 2;}for (i = outer_kernel_size; i < height - outer_kernel_size; ++i){/*unsigned short* data = src.ptr<unsigned short>(i);unsigned short* datadst = dst.ptr<unsigned short>(i);*/uchar* data = src.ptr<uchar>(i);uchar* datadst = dst.ptr<uchar>(i);for (j = outer_kernel_size; j < width - outer_kernel_size; ++j){centerpix = data[j];dataForsort.clear();if (centerpix != 0){/*环形保护带切割成四块分别计算*/for (l = i - outer_kernel_size; l < i - inner_kernel_size; ++l){for (k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (k = j - outer_kernel_size; k < j - inner_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (k = j + inner_kernel_size + 1; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i + inner_kernel_size + 1; l <= i + outer_kernel_size; ++l){for (k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}//排序sort(dataForsort.begin(), dataForsort.end());datadst[j] = dataForsort[dataForsort.size() / 2];}else{datadst[j] = 0;}}//j}//ireturn;}
阅读全文
0 0
- 滤波算法(3)
- 滤波算法(4)
- 滤波算法(其他博客)
- 滤波算法
- 滤波算法
- 滤波算法
- 滤波算法
- 滤波算法
- 滤波算法
- 一种单片机的滤波算法(转)
- 数字图像处理基本算法实现(3)--section3.5-6空间滤波处理
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(3)
- 图像滤波算法
- 常用滤波算法搜集
- 常用滤波算法
- 单片机 滤波算法
- 常用滤波算法搜集
- osea滤波算法
- 将参数内容插入到每个匹配元素(元素内部)的前面
- How to implement multiple channels in wifi module of ns3
- caffe绘制train和loss曲线
- 根目录,子目录,当前目录
- TCP三次握手与四次挥手
- 滤波算法(3)
- win10通过命令行查看无线密码
- 求助啊。。。。。这个真的写不来 。。。。。。。 前后台一起的 有源码的发一份看看 谢谢啦
- 什么是显热?什么是潜热?
- 背包问题
- 学习二维数组——没有多维数组
- Android 多窗口框架全解析
- Java的Runnable、Callable、Future、FutureTask。
- HDU