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 }
运行结果如图:
可见变得平滑很多:)