日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSE2实现HAAR小波变换(dwt2与idwt2)

發布時間:2025/7/25 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSE2实现HAAR小波变换(dwt2与idwt2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

wiki鏈接:http://en.wikipedia.org/wiki/Haar_wavelet

?

可用SSE2實現HAAR小波變換,達到實時,關于HAAR小波的介紹可參考以上維基鏈接

?參考MATLAB中dwt2與idwt2的函數原型,基于OpenCV的框架進行了匯編優化實現

HAAR小波也可用于圖像的壓縮,將CH,CV,CD中的分量值小于某一閾值則歸為0,從而這三個矩陣將成為稀疏矩陣(Sparse Matrix),反變換后的圖像的質量將取決于選擇閾值的大小。

?

實際實現時,可選擇使用浮點數(單精度或雙精度)進行矩陣計算,使用整數計算能得到更快的速度但不能進行完整的壓縮與解壓縮。

?

附代碼:

?

[cpp]?view plain?copy
  • inline?void?dwt2_row(__out?double*?ca0,??
  • ?????????????????????__out?double*?ch0,??
  • ?????????????????????__out?double*?cv0,??
  • ?????????????????????__out?double*?cd0,??
  • ?????????????????????__in?unsigned?char*?row0,??
  • ?????????????????????__in?unsigned?char*?row1,??
  • ?????????????????????__in?int?col)??
  • {??
  • ????__asm??
  • ????{??
  • ????????mov?????????eax_ptr,?ca0;??
  • ????????mov?????????ebx_ptr,?ch0;??
  • ????????mov?????????ecx_ptr,?cv0;??
  • ????????mov?????????edx_ptr,?cd0;??
  • ????????mov?????????esi_ptr,?row0;??
  • ????????mov?????????edi_ptr,?row1;??
  • ????????pxor????????xmm3,?xmm3;??
  • ????????movapd??????xmm7,?g_halfd;??
  • ????????sub?????????col,?4;??
  • ????????jl??????????loop_2;??
  • loop_4:??
  • ????????movd????????xmm1,?[esi_ptr];??
  • ????????movd????????xmm5,?[edi_ptr];??
  • ????????punpcklbw???xmm1,?xmm3;??
  • ????????punpcklbw???xmm5,?xmm3;??
  • ????????punpcklwd???xmm1,?xmm3;??
  • ????????punpcklwd???xmm5,?xmm3;??
  • ????????cvtdq2pd????xmm0,?xmm1;??
  • ????????cvtdq2pd????xmm4,?xmm5;??
  • ????????shufpd??????xmm1,?xmm1,?1;??
  • ????????shufpd??????xmm5,?xmm5,?1;??
  • ????????cvtdq2pd????xmm1,?xmm1;??
  • ????????cvtdq2pd????xmm5,?xmm5;??
  • ????????addpd???????xmm4,?xmm0;??
  • ????????addpd???????xmm5,?xmm1;??
  • ????????mulpd???????xmm4,?xmm7;??
  • ????????mulpd???????xmm5,?xmm7;??
  • ????????subpd???????xmm0,?xmm4;??
  • ????????subpd???????xmm1,?xmm5;??
  • ????????movapd??????xmm6,?xmm4;??
  • ????????movapd??????xmm2,?xmm0;??
  • ????????shufpd??????xmm4,?xmm5,?0;??
  • ????????shufpd??????xmm6,?xmm5,?3;??
  • ????????shufpd??????xmm0,?xmm1,?0;??
  • ????????shufpd??????xmm2,?xmm1,?3;??
  • ????????addpd???????xmm6,?xmm4;??
  • ????????addpd???????xmm2,?xmm0;??
  • ????????mulpd???????xmm6,?xmm7;??
  • ????????mulpd???????xmm2,?xmm7;??
  • ????????subpd???????xmm4,?xmm6;??
  • ????????subpd???????xmm0,?xmm2;??
  • ????????movupd??????[eax_ptr],?xmm6;??
  • ????????movupd??????[ebx_ptr],?xmm4;??
  • ????????movupd??????[ecx_ptr],?xmm2;??
  • ????????movupd??????[edx_ptr],?xmm0;??
  • ????????add?????????esi_ptr,?4;??
  • ????????add?????????edi_ptr,?4;??
  • ????????add?????????eax_ptr,?0x10;??
  • ????????add?????????ebx_ptr,?0x10;??
  • ????????add?????????ecx_ptr,?0x10;??
  • ????????add?????????edx_ptr,?0x10;??
  • ????????sub?????????col,?4;??
  • ????????jge?????????loop_4;??
  • loop_2:??
  • ????????cmp?????????col,?-2;??
  • ????????jl??????????loop_end;??
  • ????????pinsrw??????xmm0,?[esi_ptr],?0;??
  • ????????pinsrw??????xmm4,?[edi_ptr],?0;??
  • ????????punpcklbw???xmm0,?xmm3;??
  • ????????punpcklbw???xmm4,?xmm3;??
  • ????????punpcklwd???xmm0,?xmm3;??
  • ????????punpcklwd???xmm4,?xmm3;??
  • ????????cvtdq2pd????xmm0,?xmm0;??
  • ????????cvtdq2pd????xmm4,?xmm4;??
  • ????????addpd???????xmm4,?xmm0;??
  • ????????mulpd???????xmm4,?xmm7;??
  • ????????subpd???????xmm0,?xmm4;??
  • ????????movapd??????xmm5,?xmm4;??
  • ????????shufpd??????xmm4,?xmm0,?0;??
  • ????????shufpd??????xmm5,?xmm0,?3;??
  • ????????addpd???????xmm5,?xmm4;??
  • ????????mulpd???????xmm5,?xmm7;??
  • ????????subpd???????xmm4,?xmm5;??
  • ????????movsd???????[eax_ptr],?xmm5;??
  • ????????shufpd??????xmm5,?xmm5,?1;??
  • ????????movsd???????[ebx_ptr],?xmm4;??
  • ????????shufpd??????xmm4,?xmm4,?1;??
  • ????????movsd???????[ecx_ptr],?xmm5;??
  • ????????movsd???????[edx_ptr],?xmm4;??
  • loop_end:??
  • ????}??
  • }??
  • ??
  • inline?void?idwt2_row(__out?unsigned?char*?row0,??
  • ??????????????????????__out?unsigned?char*?row1,??
  • ??????????????????????__in?double*?ca0,??
  • ??????????????????????__in?double*?ch0,??
  • ??????????????????????__in?double*?cv0,??
  • ??????????????????????__in?double*?cd0,??
  • ??????????????????????__in?int?col)??
  • {??
  • ????__asm??
  • ????{??
  • ????????mov?????????eax_ptr,?ca0;??
  • ????????mov?????????ebx_ptr,?ch0;??
  • ????????mov?????????ecx_ptr,?cv0;??
  • ????????mov?????????edx_ptr,?cd0;??
  • ????????mov?????????esi_ptr,?row0;??
  • ????????mov?????????edi_ptr,?row1;??
  • ????????sub?????????col,?4;??
  • ????????jl??????????loop_2;??
  • loop_4:??
  • ????????movupd??????xmm0,?[eax_ptr];??
  • ????????movupd??????xmm1,?[ebx_ptr];??
  • ????????movupd??????xmm4,?[ecx_ptr];??
  • ????????movupd??????xmm5,?[edx_ptr];??
  • ????????addpd???????xmm1,?xmm0;??
  • ????????addpd???????xmm5,?xmm4;??
  • ????????addpd???????xmm0,?xmm0;??
  • ????????addpd???????xmm4,?xmm4;??
  • ????????subpd???????xmm0,?xmm1;??
  • ????????subpd???????xmm4,?xmm5;??
  • ????????movapd??????xmm2,?xmm1;??
  • ????????movapd??????xmm6,?xmm5;??
  • ????????shufpd??????xmm1,?xmm0,?0;??
  • ????????shufpd??????xmm2,?xmm0,?3;??
  • ????????shufpd??????xmm5,?xmm4,?0;??
  • ????????shufpd??????xmm6,?xmm4,?3;??
  • ????????addpd???????xmm5,?xmm1;??
  • ????????addpd???????xmm6,?xmm2;??
  • ????????addpd???????xmm1,?xmm1;??
  • ????????addpd???????xmm2,?xmm2;??
  • ????????subpd???????xmm1,?xmm5;??
  • ????????subpd???????xmm2,?xmm6;??
  • ????????cvttpd2dq???xmm5,?xmm5;??
  • ????????cvttpd2dq???xmm6,?xmm6;??
  • ????????cvttpd2dq???xmm1,?xmm1;??
  • ????????cvttpd2dq???xmm2,?xmm2;??
  • ????????shufpd??????xmm5,?xmm6,?0;??
  • ????????shufpd??????xmm1,?xmm2,?0;??
  • ????????packssdw????xmm5,?xmm1;??
  • ????????packuswb????xmm5,?xmm5;??
  • ????????pshufd??????xmm1,?xmm5,?1;??
  • ????????movd????????[esi_ptr],?xmm5;??
  • ????????movd????????[edi_ptr],?xmm1;??
  • ????????add?????????esi_ptr,?4;??
  • ????????add?????????edi_ptr,?4;??
  • ????????add?????????eax_ptr,?0x10;??
  • ????????add?????????ebx_ptr,?0x10;??
  • ????????add?????????ecx_ptr,?0x10;??
  • ????????add?????????edx_ptr,?0x10;??
  • ????????sub?????????col,?4;??
  • ????????jge?????????loop_4;??
  • loop_2:??
  • ????????cmp?????????col,?-2;??
  • ????????jl??????????loop_end;??
  • ????????movsd???????xmm0,?[eax_ptr];??
  • ????????movsd???????xmm1,?[ebx_ptr];??
  • ????????movsd???????xmm4,?[ecx_ptr];??
  • ????????movsd???????xmm5,?[edx_ptr];??
  • ????????addpd???????xmm1,?xmm0;??
  • ????????addpd???????xmm5,?xmm4;??
  • ????????addpd???????xmm0,?xmm0;??
  • ????????addpd???????xmm4,?xmm4;??
  • ????????subpd???????xmm0,?xmm1;??
  • ????????subpd???????xmm4,?xmm5;??
  • ????????shufpd??????xmm1,?xmm0,?0;??
  • ????????shufpd??????xmm5,?xmm4,?0;??
  • ????????addpd???????xmm5,?xmm1;??
  • ????????addpd???????xmm1,?xmm1;??
  • ????????subpd???????xmm1,?xmm5;??
  • ????????cvttpd2dq???xmm5,?xmm5;??
  • ????????cvttpd2dq???xmm1,?xmm1;??
  • ????????packssdw????xmm5,?xmm1;??
  • ????????packuswb????xmm5,?xmm5;??
  • ????????movd????????eax_ptr,?xmm5;??
  • ????????mov?????????[esi_ptr],?ax;??
  • ????????shr?????????eax_ptr,?16;??
  • ????????stosw;??
  • loop_end:??
  • ????}??
  • }??
  • ??
  • inline?void?dwt2(__out?cv::Mat&?CA,??
  • ?????????????????__out?cv::Mat&?CH,??
  • ?????????????????__out?cv::Mat&?CV,??
  • ?????????????????__out?cv::Mat&?CD,??
  • ?????????????????__in?cv::Mat?const&?I)??
  • {??
  • ????if(CA.type()?!=?CV_64FC1?||?CH.type()?!=?CV_64FC1?||?CV.type()?!=?CV_64FC1?||?CD.type()?!=?CV_64FC1?||?I.channels()?!=?1)??
  • ????????return;??
  • ??
  • ????double*?ca?=?reinterpret_cast<double*>(CA.data);??
  • ????double*?ch?=?reinterpret_cast<double*>(CH.data);??
  • ????double*?cv?=?reinterpret_cast<double*>(CV.data);??
  • ????double*?cd?=?reinterpret_cast<double*>(CD.data);??
  • ????unsigned?char*?row?=?reinterpret_cast<unsigned?char*>(I.data);??
  • ??
  • ????for(int?i=0;?i<I.rows;?i+=2)??
  • ????{??
  • ????????dwt2_row(ca,?ch,?cv,?cd,?row,?row+I.cols,?I.cols);??
  • ????????ca?+=?CA.cols;??
  • ????????ch?+=?CH.cols;??
  • ????????cv?+=?CV.cols;??
  • ????????cd?+=?CD.cols;??
  • ????????row?+=?I.cols*2;??
  • ????}??
  • }??
  • ??
  • inline?void?idwt2(__out?cv::Mat&?I,??
  • ??????????????????__in?cv::Mat?const&?CA,??
  • ??????????????????__in?cv::Mat?const&?CH,??
  • ??????????????????__in?cv::Mat?const&?CV,??
  • ??????????????????__in?cv::Mat?const&?CD)??
  • {??
  • ????if(CA.type()?!=?CV_64FC1?||?CH.type()?!=?CV_64FC1?||?CV.type()?!=?CV_64FC1?||?CD.type()?!=?CV_64FC1?||?I.channels()?!=?1)??
  • ????????return;??
  • ??
  • ????double*?ca?=?reinterpret_cast<double*>(CA.data);??
  • ????double*?ch?=?reinterpret_cast<double*>(CH.data);??
  • ????double*?cv?=?reinterpret_cast<double*>(CV.data);??
  • ????double*?cd?=?reinterpret_cast<double*>(CD.data);??
  • ????unsigned?char*?row?=?reinterpret_cast<unsigned?char*>(I.data);??
  • ??
  • ????for(int?i=0;?i<I.rows;?i+=2)??
  • ????{??
  • ????????idwt2_row(row,?row+I.cols,?ca,?ch,?cv,?cd,?I.cols);??
  • ????????ca?+=?CA.cols;??
  • ????????ch?+=?CH.cols;??
  • ????????cv?+=?CV.cols;??
  • ????????cd?+=?CD.cols;??
  • ????????row?+=?I.cols*2;??
  • ????}??
  • }??

  • 版權歸作者所有,轉載請注明出處!

    總結

    以上是生活随笔為你收集整理的SSE2实现HAAR小波变换(dwt2与idwt2)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。