OpenCV2邻域和模板操作
2015-06-18 16:48
393 查看
OpenCV2邻域和模板操作
在图像处理中,通过当前位置的邻域像素计算新的像素值是很常见的操作。当邻域包含图像的上几行和下几行时,就需要同时扫描图像的若干行,这就是图像的邻域操作了。至于模板操作是实现空间滤波的基础,通常是使用一个模板(一个的矩形)滑过整幅图像产生新的像素。下面介绍通过使用OpenCV2实现Laplace算子锐化图像,来介绍OpenCV2中对邻域和模板的操作。锐化处理主要的目的是突出灰度的过渡部分,通常由微分来定义和实现锐化算子的各种方法。Laplace算子是最贱的各向同性微分算子,常用的Laplace模板如下:![](http://images.cnitblog.com/blog/439761/201405/052216147457545.png)
1: /*
2: 0 -1 0
3: -1 4 -1
4: 0 -1 0
5: */
6: void sharpen(const Mat & image,Mat & result)
7: {
8: CV_Assert(image.depth() == CV_8U);
9:
10: result.create(image.size(),image.type());
11:
12: const int channels = image.channels() ;
13: for(int j = 1 ;j < image.rows - 1 ; j ++){
14: const uchar * previous = image.ptr<const uchar>(j - 1) ; // 当前行的上一行
15: const uchar * current = image.ptr<const uchar>(j) ; //当前行
16: const uchar * next = image.ptr<const uchar>(j + 1) ; //当前行的下一行
17:
18: uchar * output = result.ptr<uchar>(j) ; // 输出行
19: for(int i = channels ; i < channels * (image.cols - 1) ; i ++) {
20: * output ++ = saturate_cast<uchar>( 4 * current[i] - previous[i] - next[i] - current[i - channels] - current[ i + channels]) ;
21: }
22: }
23:
24: //对图像边界进行处理
25: //边界像素设置为0
26: result.row(0).setTo(Scalar(0));
27: result.row(result.rows-1).setTo(Scalar(0)) ;
28: result.col(0).setTo(Scalar(0));
29: result.col(result.cols-1).setTo(Scalar(0));
30: }这里使用指针遍历整个图像,使用三个指针同时扫描图像的三行,另外使用一个指针指向输出行。在计算输出像素时,使用模板函数saturate_cast<uchar>对计算结果进行调整。这是因为对像素值的计算有可能导致结果超出了像素允许的范围,即小于0或者大于255,当计算结果是浮点数时,该函数会将结果取整至最近的整数。由于边界的像素没有完整的邻域,无法使用模板计算其值,需要单独处理。这里只是简单的将其值设为0.测试代码:
1: Mat image = imread("d:\\lenna.jpg") ;
2: Mat result ;
3: sharpen(image,result) ;
4: imwrite("d:\\lenna1.jpg",result) ;
5: imwrite("d:\\lenna2.jpg",image + result) ;结果如下:
![](http://images.cnitblog.com/blog/439761/201405/052216169796662.png)
![](http://images.cnitblog.com/blog/439761/201405/052216209017093.png)
1: void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )参数:src,输入图像dst 输出图像,和输入图像有相同的大小和通道ddepth 输出图像的depth,如果为负数,则和输入图像的depth相同kernel 模板anchor 进行卷积运算的中心位置,默认的是kernel的中心delta 可选值,加到输出像素上的值bordertype 对输出图像边界的处理。使用filter2D实现Laplace算子
1: Mat kern = (Mat_<char> (3,3) << 1,1,1,
2: 1,-8,1,
3: 1,1,1) ;
4: filter2D(image,result,image.depth(),kern) ;
这里只需要定义好kernel调用filter2D即可,而且OpenCV对该函数进行了优化,其效率要比上面使用指针实现的要高。
网址:/article/5704304.html
相关文章推荐
- nginx服务器优化(重要)
- 讨论如何抓取使用cdn背后网站的源ip地址
- Docker:尝试篇
- 三层架构及MVC
- mysql主从复制(linux下)
- Win8手动为IE10添加Flash支持以便浏览网站
- linux
- OpenCV在矩阵上的卷积
- Linux使用scp命令进行文件远程的上传或下载
- linux中使用pthread_kill函数测试线程是否存活的例子
- 为什么hadoop要自己建立序列化框架
- 为什么hadoop要自己建立序列化框架
- Nginx负载均衡和LVS负载均衡的比较分析
- FreeSwitch SIP(1):linux下编译安装v1.4
- shell脚本编程基础总结
- 在Linux系统中使用xargs命令的教程
- Masonry 和 cocopods 介绍及安装步骤
- postgres CENTOS7 上防火墙问题。
- linux强制卸载mysql
- Linux 命令行使用技巧