OPENCV实现小波分析的一个例程

小波分析是多尺度实现图像时频转换的一种方式,在图像处理学习中有相当多的应用,具体介绍可见如下博客:

https://blog.csdn.net/qq_20823641/article/details/51829981

或者冈萨雷斯的数字图像处理中小波分析的一章,需要良好的离散数学功底,不太容易理解,适合研究生学习。

如下是在opencv3.0环境下的一个哈尔小波变换级反变换程序,有不足之处欢迎大家指出。

#include"stdafx.h"
#include
#include
using namespace cv;
int thundershock() {
	Mat src = imread("lena.jpg", 0);
	Mat dst;
	int Width = src.cols;
	int Height= src.rows;
	//小波分解次数
	int depth = 1;//
	int depthcount = 1;
	//改变数据格式防止溢出
	Mat tmp = Mat::zeros(src.size(), CV_32FC1);
	Mat  wavelet = Mat::zeros(src.size(), CV_32FC1);
	Mat  imgtmp = src.clone();
	imgtmp.convertTo(imgtmp, CV_32FC1);
	//执行小波变换
	while (depthcount <= depth) {
		Width = src.cols / pow(2,depthcount-1);
		Height = src.rows/pow(2,depthcount-1);
		for (int i = 0; i < Height; i++) {
			for (int j = 0; j < Width / 2; j++) {
				tmp.at(i, j) = (imgtmp.at(i, 2 * j) + imgtmp.at(i, 2 * j + 1)) / 2;
				tmp.at(i, j + Width / 2) = (imgtmp.at(i, 2 * j) - imgtmp.at(i, 2 * j + 1)) / 2;
			}






		}
		for (int i = 0; i < Height / 2; i++) {
			for (int j = 0; j < Width; j++) {
				wavelet.at(i, j) = (tmp.at(2 * i, j) + tmp.at(2 * i + 1, j)) / 2;
				wavelet.at(i + Height / 2, j) = (tmp.at(2 * i, j) - tmp.at(2 * i + 1, j)) / 2;
			}
		}
		imgtmp = wavelet;
		depthcount++;
	}
	namedWindow("DST", WINDOW_AUTOSIZE);
	convertScaleAbs(wavelet, dst);
	
	
	imshow("DST", dst);
	//反变换
	while (depthcount > 1) {
	
		for (int i = 0; i < Height / 2; i++) {
			for (int j = 0; j < Width; j++) {
				tmp.at(2*i, j) = wavelet.at( i, j) + wavelet.at(i+Height/2,j);
				tmp.at(2*i+1, j) = wavelet.at( i, j) - wavelet.at(i + Height/2, j);
			}
		}
		for (int i = 0; i < Height; i++) {
			for (int j = 0; j < Width / 2; j++) {
				imgtmp.at(i, 2*j) = tmp.at(i,  j) + tmp.at(i,  j + Width/2);
				imgtmp.at(i, 2*j+1) = tmp.at(i,  j) - tmp.at(i,  j + Width/2);
			}
		}
		depthcount--;
		wavelet = imgtmp;
		Height *= 2;
		Width *= 2;


	}
	namedWindow("restruct", WINDOW_AUTOSIZE);
	convertScaleAbs(imgtmp, imgtmp);


	
	imshow("restruct", imgtmp);
	waitKey();
	imwrite("haar.jpg", dst);
	return 0;
}

附执行结果:
OPENCV实现小波分析的一个例程_第1张图片


你可能感兴趣的:(研究生)