• 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

    运行结果如图:

    可见变得平滑很多:)

  • 相关阅读:
    常见保护方式简介
    各种保护机制绕过手法
    ShellCode框架(Win32ASM编写)
    单例模式
    HTTP1.0、HTTP1.1、HTTP2.0的关系和区别
    java集合提供的排序算法
    Dubbox以及微服务
    进程栈帧
    java线程池
    Java多态的实现
  • 原文地址:https://www.cnblogs.com/Malo_Fleur/p/5768205.html
Copyright © 2020-2023  润新知