您的位置:首页 > 其它

7. 对一幅灰度图像进行离散余弦变换,用图像的形式显示其变换系数。变换后去掉小于系数最大值60% 、80%、90%的系数,在进行反变换,观察变换前后图像区别。

2016-05-03 09:49 471 查看
#include <cxcore.h>
#include <cv.h>
#include <highgui.h>
void cvDcT(CvArr * src_arr, CvArr * dst_arr)
{
CvMat * tmp;
CvMat q1stub, q2stub;
CvMat q3stub, q4stub;
CvMat d1stub, d2stub;
CvMat d3stub, d4stub;
CvMat * q1, *q2, *q3, *q4;
CvMat * d1, *d2, *d3, *d4;

CvSize size = cvGetSize(src_arr);
CvSize dst_size = cvGetSize(dst_arr);
int cx, cy;

if (dst_size.width != size.width ||
dst_size.height != size.height){
cvError(CV_StsUnmatchedSizes, "cvShiftDFT", "Source and Destination arrays must have equal sizes", __FILE__, __LINE__);
}

if (src_arr == dst_arr){
tmp = cvCreateMat(size.height / 2, size.width / 2, cvGetElemType(src_arr));
}

cx = size.width / 2;
cy = size.height / 2;

q1 = cvGetSubRect(src_arr, &q1stub, cvRect(0, 0, cx, cy));
q2 = cvGetSubRect(src_arr, &q2stub, cvRect(cx, 0, cx, cy));
q3 = cvGetSubRect(src_arr, &q3stub, cvRect(cx, cy, cx, cy));
q4 = cvGetSubRect(src_arr, &q4stub, cvRect(0, cy, cx, cy));
d1 = cvGetSubRect(dst_arr, &d1stub, cvRect(0, 0, cx, cy));
d2 = cvGetSubRect(dst_arr, &d2stub, cvRect(cx, 0, cx, cy));
d3 = cvGetSubRect(dst_arr, &d3stub, cvRect(cx, cy, cx, cy));
d4 = cvGetSubRect(dst_arr, &d4stub, cvRect(0, cy, cx, cy));

if (src_arr != dst_arr){
if (!CV_ARE_TYPES_EQ(q1, d1)){
cvError(CV_StsUnmatchedFormats, "cvShiftDFT", "Source and Destination arrays must have the same format", __FILE__, __LINE__);
}
cvCopy(q3, d1, 0);
cvCopy(q4, d2, 0);
cvCopy(q1, d3, 0);
cvCopy(q2, d4, 0);
}
else{
cvCopy(q3, tmp, 0);
cvCopy(q1, q3, 0);
cvCopy(tmp, q1, 0);
cvCopy(q4, tmp, 0);
cvCopy(q2, q4, 0);
cvCopy(tmp, q2, 0);
}
}

int main(int argc, char ** argv)
{
const char* filename = argc >= 2 ? argv[1] : "2.bmp";
IplImage * im;

IplImage * realInput;
IplImage * imaginaryInput;
IplImage * complexInput;
int dft_M, dft_N;
CvMat* dft_A, tmp;
IplImage * image_Re;
IplImage * image_Im;
double m, M;
im = cvLoadImage("6013202130.bmp", CV_LOAD_IMAGE_GRAYSCALE);
if (!im)
return -1;
realInput = cvCreateImage(cvGetSize(im), IPL_DEPTH_64F, 1);
imaginaryInput = cvCreateImage(cvGetSize(im), IPL_DEPTH_64F, 1);
complexInput = cvCreateImage(cvGetSize(im), IPL_DEPTH_64F, 2);
cvScale(im, realInput, 1.0, 0.0);
cvZero(imaginaryInput);
cvMerge(realInput, imaginaryInput, NULL, NULL, complexInput);
dft_M = cvGetOptimalDFTSize(im->height - 1);
dft_N = cvGetOptimalDFTSize(im->width - 1);
dft_A = cvCreateMat(dft_M, dft_N, CV_64FC2);
image_Re = cvCreateImage(cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);
image_Im = cvCreateImage(cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);
cvGetSubRect(dft_A, &tmp, cvRect(0, 0, im->width, im->height));
cvCopy(complexInput, &tmp, NULL);
if (dft_A->cols > im->width)
{
cvGetSubRect(dft_A, &tmp, cvRect(im->width, 0, dft_A->cols - im->width, im->height));
cvZero(&tmp);
}
cvDFT(dft_A, dft_A, CV_DXT_FORWARD, complexInput->height);
cvNamedWindow("原图6013202130", 0);
cvNamedWindow("变换后", 0);
cvShowImage("原图6013202130", im);
cvSplit(dft_A, image_Re, image_Im, 0, 0);
cvPow(image_Re, image_Re, 2.0);
cvPow(image_Im, image_Im, 2.0);
cvAdd(image_Re, image_Im, image_Re, NULL);
cvPow(image_Re, image_Re, 0.5);
cvAddS(image_Re, cvScalarAll(1.0), image_Re, NULL);
cvLog(image_Re, image_Re);
cvDcT(image_Re, image_Re);
cvMinMaxLoc(image_Re, &m, &M, NULL, NULL, NULL);
cvScale(image_Re, image_Re, 1.0 / (M - m), 1.0*(-m) / (M - m));
cvShowImage("变换后", image_Re);
cvWaitKey(-1);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: