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 <opencv2opencv.hpp>
 4 #include <opencv2highguihighgui.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

运行结果如图:

可见变得平滑很多:)

原文地址:https://www.cnblogs.com/Malo_Fleur/p/5768205.html