成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

圖像處理之DCT圖像壓縮(基于c++opencv實(shí)現(xiàn))-創(chuàng)新互聯(lián)

是老師布置的作業(yè),拖到ddl才開始,opencv也才剛接觸,有自己結(jié)合百度的一點(diǎn)理解,如有誤,請(qǐng)諒解!

站在用戶的角度思考問題,與客戶深入溝通,找到牙克石網(wǎng)站設(shè)計(jì)與牙克石網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋牙克石地區(qū)。DCT圖像壓縮

先貼一段在matlab上實(shí)現(xiàn)的代碼,這個(gè)在網(wǎng)上都可以查到,就不贅述了

I=imread('cameraman.tif');
I=im2double(I);%將圖像轉(zhuǎn)換為雙精度
T=dctmtx(8);% 返回8*8的DCT變換矩陣
B=blkproc(I,[8 8],'P1*x*P2',T,T');
% x就是每一個(gè)分成的8*8大小的塊,P1*x*P2相當(dāng)于像素塊的處理函數(shù),p1=T p2=T’,
%也就是fun=p1*x*p2'=T*x*T'的功能是進(jìn)行離散余弦變換
mask=   [1 1 1 1 0 0 0 0 
         1 1 1 0 0 0 0 0 
         1 1 0 0 0 0 0 0 
         1 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0];% 保留左上角十個(gè)系數(shù)
B2=blkproc(B,[8 8],'P1.*x',mask);%舍棄每個(gè)塊中的高頻系數(shù),達(dá)到圖像壓縮的目的
I2=blkproc(B2,[8 8],'P1*x*P2',T',T); %進(jìn)行反余弦變換,得到壓縮后的圖象
figure(1);
subplot(1,4,1),imshow(I);
subplot(1,4,2),imshow(B);
subplot(1,4,3),imshow(B2);
subplot(1,4,4),imshow(I2);
Z  = imabsdiff(I,I2);
figure(2);
imshow(Z);

思路如下:

先劃分處理塊大小,對(duì)每個(gè)塊分別進(jìn)行DCT變換,再舍棄每個(gè)塊中的高頻系數(shù),再進(jìn)行反余弦變換,得到壓縮圖像(即先使用DCT函數(shù)將低頻的點(diǎn)都集中在左上角,再對(duì)右下角的高頻數(shù)據(jù)丟棄)

老師要求我們用c++ + opencv實(shí)現(xiàn)。配置環(huán)境真的是。。。。

試過用clion和vscode配,失敗了,還是老老實(shí)實(shí)用vs2019吧。

附 大佬配置的視頻,十分感謝!

https://www.bilibili.com/video/BV1mE411P76Mp=1&vd_source=393e209b3fa00543c23db5753b265d30

下面是用c++ 實(shí)現(xiàn)的代碼 RGB圖(下面有灰度圖,其實(shí)差不多)
#include 
#includeusing namespace cv;
using namespace std;

double T = 100;

int main()
{
    Mat src = imread("D:\\Matlab\\toolbox\\images\\imdata\\kids.tif");//先讀入圖像,在這里讀入的是RGB圖像,有三個(gè)通道
   

    
 
    imshow("clock", src);//先顯示圖像



    int big;
    big = 8;//定義一下掩蓋矩陣的大小
    vectormv;
    split(src, mv);//通道分割



    Mat b = Mat_(mv[0]);
    Mat g = Mat_(mv[1]);
    Mat r = Mat_(mv[2]);

    b.convertTo(b, CV_32F, 1.0 / 255);
    g.convertTo(g, CV_32F, 1.0 / 255);
    r.convertTo(r, CV_32F, 1.0 / 255);

    //要進(jìn)行DCT變換先轉(zhuǎn)換成float,我也不知道為什么
    Mat bDCT = Mat_(b); //這里先復(fù)制矩陣,后面有用
    Mat gDCT = Mat_(g);
    Mat rDCT = Mat_(r);
    int w = b.rows;
    int h = b.cols;//三個(gè)通道的大小都是一樣的,所以只要取一個(gè)就好了
  



    //DCT變換每個(gè)通道都做一遍
 
    for (int i1 = 0; i1< (h / big); i1++) {//注意這里的取值和我們平常遇到的x,y不一樣 一張寬度x像素、高度y像素的灰度圖保存在一個(gè)y * x的矩陣中。
        for (int j1 = 0; j1< (w / big); j1++) {
            dct(b(Rect(i1 * big, j1 * big, big, big)), bDCT(Rect(i1 * big, j1 * big, big, big)));//Rect是滑塊函數(shù),從指定位置取指定大小的矩陣,這就是跟Matlab分塊處理一樣

        }
    }

    //發(fā)現(xiàn)有的圖像不是長(zhǎng)寬相同的,所以取整除,而沒有取到數(shù)據(jù),跟之前相同就行了,復(fù)制的用處就來啦


    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            dct(g(Rect(i1 * big, j1 * big, big, big)), gDCT(Rect(i1 * big, j1 * big, big, big)));

        }
    }

    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            dct(r(Rect(i1 * big, j1 * big, big, big)), rDCT(Rect(i1 * big, j1 * big, big, big)));

        }
    }
    


    int mask[8][8] = {//定義掩蓋矩陣
        {1, 1, 1, 1, 0, 0, 0, 0},
        {1, 1, 1, 0, 0, 0, 0, 0},
        {1, 1, 0, 0, 0, 0, 0, 0},
        {1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        
    };

    //根據(jù)mask 矩陣 去掉右下角的數(shù)據(jù),同樣對(duì)每個(gè)通道做一次
    for (int i1 = 0; i1< (bDCT.rows / big); i1++) 
    {
        for (int j1 = 0; j1< (bDCT.cols / big); j1++) 
        {

            for (int i = 0; i< big; i++)
            {

                for (int j = 0; j< big; j++)
                {
                    if (mask[i % big][j % big] == 0)
                    {
                        bDCT.at(i1 * big + i, j1 * big + j) = 0;//這里和mask矩陣相乘是同一個(gè)意思,同時(shí)掃描mask和DCT變換后的矩陣,當(dāng)mask矩陣掃描到的值為0時(shí),把DCT矩陣也置零,去掉高頻數(shù)據(jù)
                    }
                }
            }
        }
    }

    for (int i1 = 0; i1< (gDCT.rows / big); i1++)
    {
        for (int j1 = 0; j1< (gDCT.cols / big); j1++)
        {

            for (int i = 0; i< big; i++)
            {

                for (int j = 0; j< big; j++)
                {
                    if (mask[i % big][j % big] == 0)
                    {
                        gDCT.at(i1 * big + i, j1 * big + j) = 0;;
                    }
                }
            }
        }
    }    for (int i1 = 0; i1< (rDCT.rows / big); i1++)
    {
        for (int j1 = 0; j1< (rDCT.cols / big); j1++)
        {

            for (int i = 0; i< big; i++)
            {

                for (int j = 0; j< big; j++)
                {
                    if (mask[i % big][j % big] == 0)
                    {
                        rDCT.at(i1 * big + i, j1 * big + j) = 0;;
                    }
                }
            }
        }
    }


    Mat iDctb = bDCT;
    Mat iDctg = gDCT;
    Mat iDctr = rDCT;

    //進(jìn)行逆DCT變換,同做三次
    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            idct(bDCT(Rect(i1 * big, j1 * big, big, big)), iDctb(Rect(i1 * big, j1 * big, big, big)));

        }
    }
    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            idct(gDCT(Rect(i1 * big, j1 * big, big, big)), iDctg(Rect(i1 * big, j1 * big, big, big)));

        }
    }
    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            idct(rDCT(Rect(i1 * big, j1 * big, big, big)), iDctr(Rect(i1 * big, j1 * big, big, big)));

        }
    }

    mv[0] = iDctb;
    mv[1] = iDctg;
    mv[2] = iDctr;
    Mat dst;
    merge(mv, dst);//通道合并


    imshow("DstImage",dst);//顯示圖像

    waitKey(0);

    return 0;

}
效果如下:

原圖:

壓縮后:

如果感覺不明顯,可以減少mask矩陣1的個(gè)數(shù)。

灰度圖
int main()
{
    Mat src = imread("D:\\Matlab\\toolbox\\images\\imdata\\coins.png",0);
    imshow("clock", src);
    src = Mat_(src);
    int w = src.rows;
    int h = src.cols;
    
   

   

    int big;
    big = 8;
    src.convertTo(src, CV_32F, 1.0 / 255);
    Mat srcDCT = Mat_(src);

    
   

    
    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            dct(src(Rect(i1 * big, j1 * big, big, big)),srcDCT(Rect(i1 * big, j1 * big, big, big)));
          
        }
    }


    int mask[8][8] = {
        {1, 1, 1, 1, 0, 0, 0, 0},
        {1, 1, 1, 0, 0, 0, 0, 0},
        {1, 1, 0, 0, 0, 0, 0, 0},
        {1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},

    };
    double s;  
    for (int i1 = 0; i1< (srcDCT.rows / big); i1++) {
        for (int j1 = 0; j1< (srcDCT.cols / big); j1++) {

            for (int i = 0; i< big; i++)
            {

                for (int j = 0; j< big; j++)
                {
                    if (mask[i % big][j % big] == 0) {
                        srcDCT.at(i1 * big + i, j1 * big + j) = 0;;
                        

                    }
                    else {
                        s = 0;
                    }
                }
            }
        }
    }
   Mat iDct1 = srcDCT;
    
    for (int i1 = 0; i1< (h / big); i1++) {
        for (int j1 = 0; j1< (w / big); j1++) {
            idct(srcDCT(Rect(i1 * big, j1 * big, big, big)), iDct1(Rect(i1 * big, j1 * big, big, big)));

        }
    }

    imshow("c", srcDCT);




    imshow("DstImage",iDct1);

    waitKey(0);

    return 0;

}

感謝觀看,如有誤,請(qǐng)不吝賜教。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:圖像處理之DCT圖像壓縮(基于c++opencv實(shí)現(xiàn))-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://jinyejixie.com/article10/gphgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、搜索引擎優(yōu)化、App開發(fā)網(wǎng)站改版、網(wǎng)站收錄、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
巴楚县| 万荣县| 青川县| 凯里市| 社会| 安多县| 永善县| 化州市| 广丰县| 航空| 黄大仙区| 乌恰县| 巨野县| 峨边| 得荣县| 高阳县| 武平县| 贡嘎县| 长岭县| 无棣县| 苍溪县| 吉木乃县| 徐汇区| 莱西市| 邻水| 桑日县| 林周县| 潞西市| 巴中市| 汶川县| 芒康县| 灌阳县| 孝感市| 武穴市| 同江市| 乐都县| 那坡县| 东乌珠穆沁旗| 高雄县| 红安县| 五寨县|