本章内容:
1. 积分图像
2. 盒子滤波(均值滤波)
1. 积分图像
输出结果
2. 盒子滤波(均值滤波)
输出结果:
源码
#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;
}