diff --git a/demo/imagedemo2.cpp b/demo/imagedemo2.cpp new file mode 100644 index 0000000..33edcf1 --- /dev/null +++ b/demo/imagedemo2.cpp @@ -0,0 +1,289 @@ +//============================================================================ +// Name : imagedemo2.cpp +// Author : Rafat Hussain +// Version : +// Copyright : +// Description : Image Approximation +//============================================================================ + +#include +#include +#include +#include +#include +#include +#include "cv.h" +#include "highgui.h" +#include "cxcore.h" +#include "wavelet.h" + +using namespace std; +using namespace cv; + +void findthresh(vector &vector1, int N, double& t){ + sort(vector1.begin(), vector1.end(), greater()); + t = vector1.at(N-1); +} + +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"); + + + 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 = "db3"; + // Finding DWT output dimensions as the DWT output is zeropadded + dwt_output_dim(vec1, rr1, cc1 ); + int J = 6; + 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; + + + + vector > dwt_coef1(rr1, vector(cc1)); + vector > dwt_coef2(rr1, vector(cc1)); + // Storing dwt_output for two different computations based on + // different approximation values + dwt_coef1 = dwt_output; + dwt_coef2 = dwt_output; + + + + //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 ); + + // 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]) ; + } + } + } + // IMPORTANT -- dwt_output value has been modified above. + + cvNamedWindow( "DWT Image", 1 ); // creation of a visualisation window + cvShowImage( "DWT Image", cvImg ); // image visualisation + cvWaitKey(); + cvDestroyWindow("DWT Image"); + + + // Case 1 : Only 10% of the largest coefficients are considered + + // Total elements in the original image is rows * cols + int n_coef1= int (( rows * cols)/ 10); + + // Finding Threshold Value corresponding to n_coef1 + + vector temp1; + cout << "size: " << (int) temp1.size() << "\n"; + cout << "capacity: " << (int) temp1.capacity() << "\n"; + cout << "max_size: " << (int) temp1.max_size() << "\n"; + for (int i =0; i < rr1; i++) { + for (int j = 0; j < cc1; j++){ + double tempval = abs(dwt_coef1[i][j]); + temp1.push_back(tempval); + } + } + + double thresh1= 0.0; + findthresh(temp1,n_coef1,thresh1); + ofstream temp("temp.txt"); + for (int i =0; i < rows * cols; i++){ + temp << temp1[i] << " " ; + } + // Reset coeffficients value depending on threshold value + + + for (int i =0; i < rr1; i++) { + for (int j = 0; j < cc1; j++){ + double temp = abs(dwt_coef1[i][j]); + + if (temp < thresh1){ + dwt_coef1[i][j] = 0.0; + + } + } + } + + + // Finding IDWT + vector > final(rr1, vector(cc1)); + idwt_2d(dwt_coef1,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( "10% Coeff Reconstructed Image", 1 ); // creation of a visualisation window + cvShowImage( "10% Coeff Reconstructed Image", dvImg ); // image visualisation + cvWaitKey(); + cvDestroyWindow("10% Coeff Reconstructed Image"); + + // Case 2 : Only 2% of the largest coefficients are considered + + // Total elements in the original image is rows * cols + int n_coef2= int (( rows * cols) / 50); + + // Finding Threshold Value corresponding to n_coef1 + + vector temp2; + for (int i =0; i < rr1; i++) { + for (int j = 0; j < cc1; j++){ + double tempval = abs(dwt_coef2[i][j]); + temp2.push_back(tempval); + } + } + double thresh2= 0.0; + findthresh(temp2,n_coef2,thresh2); + + // Reset coeffficients value depending on threshold value + + for (int i =0; i < rr1; i++) { + for (int j = 0; j < cc1; j++){ + double temp = abs(dwt_coef2[i][j]); + + if (temp < thresh2){ + dwt_coef2[i][j] = 0.0; + + } + } + } + + + + + + // Finding IDWT + vector > final2(rr1, vector(cc1)); + idwt_2d(dwt_coef2,flag, nm ,final2); + + // Removing Zeropadding + + zero_remove(vec1,final2); + + //Displaying Reconstructed Image + + IplImage *dvImg2; + CvSize dvSize2; // size of output image + + dvSize2.width = final2[0].size(); + dvSize2.height = final2.size(); + + dvImg2 = cvCreateImage( dvSize2, 8, 1 ); + + for (int i = 0; i < dvSize2.height; i++ ) + for (int j = 0; j < dvSize2.width; j++ ) + ((uchar*)(dvImg2->imageData + dvImg2->widthStep*i))[j] = + (char) (final2[i][j]) ; + + cvNamedWindow( "2% Coeff Reconstructed Image", 1 ); // creation of a visualisation window + cvShowImage( "2% Coeff Reconstructed Image", dvImg2 ); // image visualisation + cvWaitKey(); + cvDestroyWindow("2% Coeff Reconstructed Image"); + + cout << thresh1 << " " << thresh2 << endl; + + + return 0; +}