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

    #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;
    }

  • 相关阅读:
    【前端积累】Awesome初识
    【Python系列】Python3获取控制台输入
    【linux系列】Centos下安装mysql数据库
    Intellij 部署项目java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    【大数据系列】节点的退役和服役[datanode,yarn]
    【大数据系列】使用api修改hadoop的副本数和块大小
    【规范】alibaba编码规范阅读
    【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes
    【分布式系列之ActiveMq】ActiveMq入门示例
    类的生命周期
  • 原文地址:https://www.cnblogs.com/zhangfeionline/p/5465204.html
Copyright © 2011-2022 走看看