opencv3 离线余弦变换和逆变换

代码如下

#include<opencv.hpp>  

int main()
{
	cv::Mat image;
	cv::Mat dctimage;
	image = cv::imread("F:\\ebook\\opencv\\LearningOpenCV3\\test\\timg.jpg", 0);
	cv::namedWindow("My window");
	cv::imshow("My window", image);
	cv::waitKey(0);
	image.convertTo(image, CV_32F, 1.0 / 255);

	cv::dct(image, dctimage);      //离散余弦变换
	cv::imshow("My window", dctimage);
	cv::waitKey(0);

	int h=dctimage.size[0];
	int w = dctimage.size[1];
	cv::Size s = {w,h};
	cv::Mat idctimage=cv::Mat::zeros(h,w,CV_32F);
	
	int left_h = 0;
	int left_w = 0;
	int right_h = 192;
	int right_w = 288;
	for (int i = left_h; i < right_h;i++)
	for (int j = left_w; j < right_w; j++)
	{
		idctimage.at<float>(i, j) = dctimage.at<float>(i, j);

	}

	cv::imshow("My window", idctimage);
	cv::waitKey(0);

	cv::idct(idctimage, idctimage);         //离散余弦逆变换
	cv::imshow("My window", idctimage);
	cv::waitKey(0);

	cv::destroyWindow("My window");
	return 0;
}

原图image如下图
在这里插入图片描述
离线余弦变换后的dctimage如下图
在这里插入图片描述
在进行离线余弦逆变换时只取了dctimage[0:192,0:288]部分进行计算,而原始尺寸为[810,1440],逆变换后效果如图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34662299/article/details/85796555