zoukankan      html  css  js  c++  java
  • 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

    运行结果如图:

    可见变得平滑很多:)

  • 相关阅读:
    本周总结
    本周总结:用户故事和用户场景
    排球比赛规则说明书
    我与计算机
    官网地址备份
    连续自然数序列,求取中位数方案
    Spark 实现自定义对象sequenceFile方式存储,读写示例(scala编写)
    hbase 异常
    python_初步
    redis_入门网址
  • 原文地址:https://www.cnblogs.com/Malo_Fleur/p/5768205.html
Copyright © 2011-2022 走看看