OPENCV学习一(滤波)
来源:互联网 发布:adobe reader for mac 编辑:程序博客网 时间:2024/05/19 00:17
opencv中常见的4种滤波算有均值滤波,高斯滤波,中值滤波,双边滤波。
双边滤波:
- /****************************************************************************************\
- Bilateral Filtering
- \****************************************************************************************/
- namespace cv
- {
- static void
- bilateralFilter_8u( const Mat& src, Mat& dst, int d,
- double sigma_color, double sigma_space,
- int borderType )
- {
- int cn = src.channels();
- int i, j, k, maxk, radius;
- Size size = src.size();
- CV_Assert( (src.type() == CV_8UC1 || src.type() == CV_8UC3) &&
- src.type() == dst.type() && src.size() == dst.size() &&
- src.data != dst.data );
- if( sigma_color <= 0 )
- sigma_color = 1;
- if( sigma_space <= 0 )
- sigma_space = 1;
- double gauss_color_coeff = -0.5/(sigma_color*sigma_color);
- double gauss_space_coeff = -0.5/(sigma_space*sigma_space);
- if( d <= 0 )
- radius = cvRound(sigma_space*1.5);
- else
- radius = d/2;
- radius = MAX(radius, 1);
- d = radius*2 + 1;
- Mat temp;
- copyMakeBorder( src, temp, radius, radius, radius, radius, borderType );
- vector<float> _color_weight(cn*256);
- vector<float> _space_weight(d*d);
- vector<int> _space_ofs(d*d);
- float* color_weight = &_color_weight[0];
- float* space_weight = &_space_weight[0];
- int* space_ofs = &_space_ofs[0];
- // initialize color-related bilateral filter coefficients
- for( i = 0; i < 256*cn; i++ )
- color_weight[i] = (float)std::exp(i*i*gauss_color_coeff);
- // initialize space-related bilateral filter coefficients
- for( i = -radius, maxk = 0; i <= radius; i++ )
- for( j = -radius; j <= radius; j++ )
- {
- double r = std::sqrt((double)i*i + (double)j*j);
- if( r > radius )
- continue;
- space_weight[maxk] = (float)std::exp(r*r*gauss_space_coeff);
- space_ofs[maxk++] = (int)(i*temp.step + j*cn);
- }
- for( i = 0; i < size.height; i++ )
- {
- const uchar* sptr = temp.data + (i+radius)*temp.step + radius*cn;
- uchar* dptr = dst.data + i*dst.step;
- if( cn == 1 )
- {
- for( j = 0; j < size.width; j++ )
- {
- float sum = 0, wsum = 0;
- int val0 = sptr[j];
- for( k = 0; k < maxk; k++ )
- {
- int val = sptr[j + space_ofs[k]];
- float w = space_weight[k]*color_weight[std::abs(val - val0)];
- sum += val*w;
- wsum += w;
- }
- // overflow is not possible here => there is no need to use CV_CAST_8U
- dptr[j] = (uchar)cvRound(sum/wsum);
- }
- }
- else
- {
- assert( cn == 3 );
- for( j = 0; j < size.width*3; j += 3 )
- {
- float sum_b = 0, sum_g = 0, sum_r = 0, wsum = 0;
- int b0 = sptr[j], g0 = sptr[j+1], r0 = sptr[j+2];
- for( k = 0; k < maxk; k++ )
- {
- const uchar* sptr_k = sptr + j + space_ofs[k];
- int b = sptr_k[0], g = sptr_k[1], r = sptr_k[2];
- float w = space_weight[k]*color_weight[std::abs(b - b0) +
- std::abs(g - g0) + std::abs(r - r0)];
- sum_b += b*w; sum_g += g*w; sum_r += r*w;
- wsum += w;
- }
- wsum = 1.f/wsum;
- b0 = cvRound(sum_b*wsum);
- g0 = cvRound(sum_g*wsum);
- r0 = cvRound(sum_r*wsum);
- dptr[j] = (uchar)b0; dptr[j+1] = (uchar)g0; dptr[j+2] = (uchar)r0;
- }
- }
- }
- }
opencv中调用:
- bilateralFilter(InputArray src, OutputArray dst, int n, double sigmaColor, double sigmaSpace,
- int borderType=BORDER_DEFAULT );
便于自己学习查询,特记录学习点滴
阅读全文
0 0
- OPENCV学习一(滤波)
- Opencv学习一:高斯滤波
- OpenCV-滤波算子(一)
- OpenCV学习笔记(九):线性滤波:方框滤波、均值滤波、高斯滤波
- openCv学习笔记(十)-滤波
- OpenCV学习(五)平滑滤波
- OpenCV学习(五)平滑滤波
- OpenCV学习笔记(6):滤波filter2D()
- Opencv学习(1):高斯滤波
- OpenCV学习笔记(十)双边滤波
- opencv学习-imgprocess-滤波
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
- OpenCV学习笔记(十):非线性滤波:中值滤波、双边滤波
- Opencv学习:非线性滤波:中值滤波、双边滤波
- opencv简单学习方框滤波,均值滤波,高斯滤波
- opencv源码解析之(一):高斯滤波GaussianBlur()
- opencv函数源码之均值滤波(一)
- System.getProperty("line.separator") 的含义
- java 方式配置spring mvc 继承WebMvcConfigurerAdapter和继承WebMvcConfigurationSupport
- 工厂方法模式
- 两个链表的第一个公共结点
- Docker制作数据库中间件Mycat源码镜像
- OPENCV学习一(滤波)
- 如果 TCP 协议中三次握手不携带序列号,会造成什么样的后果
- 一个界面出现多个seekbar的时候导致seekbar滑动不灵敏的问题
- 1041. 考试座位号(15)
- 21.缺陷管理工具(1)
- git branch用法总结
- Eclipse和MyEclipse中导入java注解模板
- 机器学习与神经网络(三):自适应线性神经元的介绍和Python代码实现
- 【study】linux 进程通信之管道