opencv 积分图像以及盒子滤波

本章内容:


1. 积分图像
2. 盒子滤波(均值滤波)

1. 积分图像

opencv 积分图像以及盒子滤波

输出结果

opencv 积分图像以及盒子滤波

2. 盒子滤波(均值滤波)

opencv 积分图像以及盒子滤波

 

输出结果:

opencv 积分图像以及盒子滤波

源码

 

#include <ostream>
#include <opencv.hpp>
#include<opencv2/opencv.hpp>
#include "opencv2/xfeatures2d.hpp"

int main(int argc, char *argv[])
{
    /*
     本章内容:
        1. 积分图像
        2. 盒子滤波(均值滤波)
    */
    cv::String fileName = "/home/wang/dev/Image/c++father.jpg";
    cv::Mat src = cv::imread(fileName);
    cv::Mat src1 = src.clone();
    if(src.data == NULL){
        printf("图像读入失败\n");
        return -1;
    }
    cv::imshow("src",src);
    /*1.积分图像
        api接口: CV_EXPORTS_W void integral( InputArray src, OutputArray sum, int sdepth = -1 );
    */
    cv::Mat gray;
    cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
    gray.convertTo(gray,CV_32F);
    cv::Mat dstInte;//(gray.size(),CV_32S);
    cv::integral(gray,dstInte);
    cv::Mat dstInterNORM = dstInte.clone();
    cv::normalize(dstInterNORM,dstInterNORM,255,0,cv::NORM_L2);
    cv::imshow("integral image", dstInterNORM);

    // 2. 盒子滤波(均值滤波)
    std::cout << "src.size() = " << src.size() << " dstInte.size()= " << dstInte.size() << std::endl;
    cv::Mat grayM(gray.size(),CV_64F);
    int kerSize = 3;
    for(int i=kerSize; i < src.rows - kerSize; i++){
        for(int j=kerSize; j < src.cols - kerSize; j++){
            grayM.at<double>(i,j) = (dstInte.at<double>(i+kerSize,j+kerSize) + dstInte.at<double>(i-kerSize,j-kerSize)
                    - dstInte.at<double>(i+kerSize,j-kerSize) - dstInte.at<double>(i-kerSize,j+kerSize))/(kerSize*2+1)/(kerSize*2+1);
        }
    }
    std::cout << "\n type "  << dstInte.type() << std::endl;
    cv::normalize(grayM,grayM,255,0,cv::NORM_L2);
    cv::imshow("gray",gray/255);
    cv::imshow("gray filter",grayM);

    cv::waitKey(0);
    return 1;
}