1.分解
cv::pyrUp、cv::pyrDown内部实现:5x5高斯卷积 + 上/下采样(简单添加/删除奇数行列)
//1*base + n*laplace, 返回16SC1
void get_laplace_pyr(cv::Mat img, int layer_num, cv::Mat& base, std::vector<cv::Mat>& pyr_detail){
img.convertTo(img, CV_16SC1);
cv::Mat img_down, img_up;
for(int i = 0; i < layer_num; i++){
cv::pyrDown(img, img_down);
cv::pyrUp(img_down, img_up);
cv::Mat laplace = img - img_up;
pyr_detail.push_back(laplace);
img = img_down;
}
base = img_down;
}
2.重构
cv::Mat get_img_from_laplace_pyr(cv::Mat base, std::vector<cv::Mat> pyr){
cv::Mat img = base;
while (!pyr.empty()) {
cv::Mat lap = pyr.back();
pyr.pop_back();
cv::pyrUp(img, img);
img += lap;
}
img.convertTo(img, CV_8UC1);
return img;
}