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

    运行结果如图:

    可见变得平滑很多:)

  • 相关阅读:
    Java DB 访问(三)mybatis mapper interface接口
    android stdio 安装后gradle 编译失败,设置代理不管用
    超星自动签到并邮件通知
    关于解决Mac使用docker安装SQL server for Linux 中文乱码问题
    Bom简单介绍
    grid-layout
    Position
    前端学习(注册表)
    关于学精通一门语言的个人看法(欢迎留言补充)
    Google 最新推出数据集搜索
  • 原文地址:https://www.cnblogs.com/Malo_Fleur/p/5768205.html
Copyright © 2011-2022 走看看