opencv手动对BGR彩图进行均值滤波

http://blog.csdn.net/hhygcy/article/details/4325304

这篇文章中实现了对灰度图的均值滤波,但相信我们平时做图像处理的时候还是要对原图进行滤波的

当然,我们可以用cvSplit()把原图分为B、G、R三部分,分别均值,之后再cvMerge,而我这里则是直接去操作

 

http://blog.csdn.net/xiaowei_cqu/article/details/7557063

通过上面这篇文章我们可以知道三通道图像的imgData分布为:

上文中还介绍了其它的获取图像像素点的方法,在我另一篇博文中也有提到,这里不做过多阐述

于是我们的代码就可以写出来了:

 1 #include <iostream>
 2 #include <cv.h>
 3 #include <opencv2\opencv.hpp>
 4 #include <opencv2\highgui\highgui.hpp>
 5 using namespace std;
 6 using namespace cv;
 7 
 8 int main() {
 9     IplImage* img = cvLoadImage("D:\\other\\video\\437.jpg");
10 
11     uchar* data = (uchar*)img->imageData;
12     int step = img->widthStep / sizeof(uchar);
13     int channels = img->nChannels;
14     uchar* b, *g, *r;
15     uchar** pixelb = new uchar*[img->height], ** pixelg = new uchar*[img->height], ** pixelr = new uchar*[img->height];
16     for (int i = 0; i < img->height; ++i) {
17         pixelb[i] = new uchar[img->width];
18         pixelg[i] = new uchar[img->width];
19         pixelr[i] = new uchar[img->width];
20     }
21 
22     for (int i = 1; i < img->height - 1; ++i){
23         for (int j = 1; j < img->width; ++j) {
24             pixelb[i][j] =
25                 (data[(i - 1)*step + (j - 1)*channels + 0] +
26                 data[(i - 1)*step + j*channels + 0] +
27                 data[(i - 1) * step + (j + 1)*channels + 0] +
28                 data[(i)*step + (j - 1)*channels + 0] +
29                 data[(i)*step + j*channels + 0] +
30                 data[(i)* step + (j + 1)*channels + 0] +
31                 data[(i + 1)*step + (j - 1)*channels + 0] +
32                 data[(i + 1)*step + j*channels + 0] +
33                 data[(i + 1) * step + (j + 1)*channels + 0]) / 9;
34 
35             pixelg[i][j] = 
36                 (data[(i - 1)*step + (j - 1)*channels + 1] +
37                 data[(i - 1)*step + j*channels + 1] +
38                 data[(i - 1) * step + (j + 1)*channels + 1] +
39                 data[(i)*step + (j - 1)*channels + 1] +
40                 data[(i)*step + j*channels + 1] +
41                 data[(i)* step + (j + 1)*channels + 1] +
42                 data[(i + 1)*step + (j - 1)*channels + 1] +
43                 data[(i + 1)*step + j*channels + 1] +
44                 data[(i + 1) * step + (j + 1)*channels + 1]) / 9;
45 
46             pixelr[i][j] = 
47                 (data[(i - 1)*step + (j - 1)*channels + 2] +
48                 data[(i - 1)*step + j*channels + 2] +
49                 data[(i - 1) * step + (j + 1)*channels + 2] +
50                 data[(i)*step + (j - 1)*channels + 2] +
51                 data[(i)*step + j*channels + 2] +
52                 data[(i)* step + (j + 1)*channels + 2] +
53                 data[(i + 1)*step + (j - 1)*channels + 2] +
54                 data[(i + 1)*step + j*channels + 2] +
55                 data[(i + 1) * step + (j + 1)*channels + 2]) / 9;
56         }
57     }
58 
59     for (int i = 1; i < img->height; ++i) {
60         for (int j = 1; j < img->width; ++j) {
61             data[i*step + j*channels + 0] = pixelb[i][j];
62             data[i*step + j*channels + 1] = pixelg[i][j];
63             data[i*step + j*channels + 2] = pixelr[i][j];
64         }
65     }
66     cvNamedWindow("filter");
67     cvShowImage("filter", img);
68     cvWaitKey(0);
69     cvReleaseImage(&img);
70     return 0;
71 }
View Code

运行结果如图:

可见变得平滑很多:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值