From 00df1d109c2275221106674f21e854172dfdd738 Mon Sep 17 00:00:00 2001 From: "rafat.hsn@gmail.com" Date: Wed, 27 Apr 2011 01:03:15 +0000 Subject: [PATCH] 2D DWT and IDWT using OPENCV and a 512 by 512 grayscale image. --- demo/imagedemo1.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 demo/imagedemo1.cpp diff --git a/demo/imagedemo1.cpp b/demo/imagedemo1.cpp new file mode 100644 index 0000000..63b15be --- /dev/null +++ b/demo/imagedemo1.cpp @@ -0,0 +1,192 @@ +//============================================================================ +// Name : imagedemo1.cpp +// Author : Rafat Hussain +// Version : +// Copyright : +// Description : 2D DWT and IDWT using OPENCV and a 512 by 512 grayscale image. +//============================================================================ + +#include +#include +#include +#include +#include +#include "cv.h" +#include "highgui.h" +#include "cxcore.h" +#include "wavelet.h" + +using namespace std; +using namespace cv; + +void* maxval(vector > &arr, double &max){ + max = 0; + for (unsigned int i =0; i < arr.size(); i++) { + for (unsigned int j =0; j < arr[0].size(); j++) { + if (max <= arr[i][j]){ + max = arr[i][j]; + } + } + } + return 0; +} + +void* minval(vector > &arr, double &min){ + min = 10000; + for (unsigned int i =0; i < arr.size(); i++) { + for (unsigned int j =0; j < arr[0].size(); j++) { + if (min >= arr[i][j]){ + min = arr[i][j]; + } + } + } + return 0; +} + +int main() { + IplImage* img = cvLoadImage("lena512.bmp"); + if (!img){ + cout << " Can't read Image. Try Different Format." << endl; + exit(1); + } + int height, width; + height = img->height; + width = img->width; + int nc = img->nChannels; + // uchar* ptr2 =(uchar*) img->imageData; + int pix_depth = img->depth; + CvSize size; + size.width =width; + size.height=height; + cout << "depth" << pix_depth << "Channels" << nc << endl; + + + cvNamedWindow("Original Image", CV_WINDOW_AUTOSIZE); + cvShowImage("Original Image", img); + cvWaitKey(); + cvDestroyWindow("Original Image"); + cvSaveImage("orig.bmp",img); + + + int rows =(int) height; + int cols =(int) width; + Mat matimg(img); + + vector > vec1(rows, vector(cols)); + + + int k =1; + for (int i=0; i < rows; i++) { + for (int j =0; j < cols; j++){ + unsigned char temp; + temp = ((uchar*) matimg.data + i * matimg.step)[j * matimg.elemSize() + k ]; + vec1[i][j] = (double) temp; + } + + } + + int rr1,cc1; + string nm = "db4"; + // Finding DWT output dimensions as the DWT output is zeropadded + dwt_output_dim(vec1, rr1, cc1 ); + int J = 2; + vector flag; + vector > dwt_output(rr1, vector(cc1)); + cout << rr1 << cc1 << "size of op" << endl; + // Computing 2d DWT ( vec1 is the signal while dwt_output is the DWT output) + dwt_2d(vec1, J, nm, dwt_output,flag ); + + cout << "dwt size" << dwt_output.size() << dwt_output[0].size() << endl; + + double max,min; + + maxval(dwt_output,max); + minval(dwt_output,min); + cout << "maxval" << max << " minval" << min << endl; + + //Displaying Scaled Image + // Creating Image in OPENCV + IplImage *cvImg; // image used for output + CvSize imgSize; // size of output image + + imgSize.width = cc1; + imgSize.height = rr1; + + cvImg = cvCreateImage( imgSize, 8, 1 ); + // dwt_hold is created to hold the dwt output as further operations need to be + // carried out on dwt_output in order to display scaled images. + vector > dwt_hold(rr1, vector(cc1)); + dwt_hold = dwt_output; + + // Setting coefficients of created image to the scaled DWT output values + for (int i = 0; i < imgSize.height; i++ ) { + for (int j = 0; j < imgSize.width; j++ ){ + if ( dwt_output[i][j] <= 0.0){ + dwt_output[i][j] = 0.0; + } + if ( i <= (imgSize.height/pow(2.0,double(J))) && j <= (imgSize.width/pow(2.0,double(J))) ) { + ((uchar*)(cvImg->imageData + cvImg->widthStep*i))[j] = + (char) ( (dwt_output[i][j] / max) * 255.0); + } else { + ((uchar*)(cvImg->imageData + cvImg->widthStep*i))[j] = + (char) (dwt_output[i][j]) ; + } + } + } + + cvNamedWindow( "DWT Image", 1 ); // creation of a visualisation window + cvShowImage( "DWT Image", cvImg ); // image visualisation + cvWaitKey(); + cvDestroyWindow("DWT Image"); + cvSaveImage("dwt.bmp",cvImg); + // Finding IDWT + vector > final(rr1, vector(cc1)); + idwt_2d(dwt_hold,flag, nm ,final); + + // Removing Zeropadding + + zero_remove(vec1,final); + + //Displaying Reconstructed Image + + IplImage *dvImg; + CvSize dvSize; // size of output image + + dvSize.width = final[0].size(); + dvSize.height = final.size(); + + dvImg = cvCreateImage( dvSize, 8, 1 ); + + for (int i = 0; i < dvSize.height; i++ ) + for (int j = 0; j < dvSize.width; j++ ) + ((uchar*)(dvImg->imageData + dvImg->widthStep*i))[j] = + (char) (final[i][j]) ; + + cvNamedWindow( "Reconstructed Image", 1 ); // creation of a visualisation window + cvShowImage( "Reconstructed Image", dvImg ); // image visualisation + cvWaitKey(); + cvDestroyWindow("Reconstructed Image"); + cvSaveImage("recon.bmp",dvImg); + ofstream diff("diff.dat"); + for (unsigned int i=0; i < final.size(); i++) { + for (unsigned int j = 0; j < final[0].size(); j++) { + diff << final[i][j]-vec1[i][j] << " " ; + } + diff << endl; + } + ofstream recon("recon.dat"); + for (unsigned int i=0; i < final.size(); i++) { + for (unsigned int j = 0; j < final[0].size(); j++) { + recon << (int)final[i][j] << " " ; + } + recon << endl; + } + ofstream orig("orig.dat"); + for (unsigned int i=0; i < vec1.size(); i++) { + for (unsigned int j = 0; j < vec1[0].size(); j++) { + orig << (int)vec1[i][j] << " " ; + } + orig << endl; + } + return 0; +}