【C++】离散余弦变换滤波算法(DCT)

简介: 离散余弦变换滤波算法(DCT)C++实现
#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <iostream>#include <math.h>#include <complex>constintheight=128, width=128, channel=3;
// DCT hyper-parameterintT=8;
intK=8;
// DCT coefficientstructdct_str {
doublecoef[height][width][channel];
};
// Discrete Cosine transformationdct_strdct(cv::Matimg, dct_strdct_s){
doubleI;
doubleF;
doubleCu, Cv;
for (intys=0; ys<height; ys+=T){
for (intxs=0; xs<width; xs+=T){
for (intc=0; c<channel; c++){
for (intv=0; v<T; v++){
for (intu=0; u<T; u++){
F=0;
if (u==0){
Cu=1./sqrt(2);
            } else{
Cu=1;
            }
if (v==0){
Cv=1./sqrt(2);
            }else {
Cv=1;
            }
for (inty=0; y<T; y++){
for(intx=0; x<T; x++){
I= (double)img.at<cv::Vec3b>(ys+y, xs+x)[c];
F+=2./T*Cu*Cv*I*cos((2.*x+1) *u*M_PI/2./T) *cos((2.*y+1) *v*M_PI/2./T);
              }
            }
dct_s.coef[ys+v][xs+u][c] =F;
          }
        }
      }
    }
  }
returndct_s;
}
// Inverse Discrete Cosine transformationcv::Matidct(cv::Matout, dct_strdct_s){
doublef;
doubleCu, Cv;
for(intys=0; ys<height; ys+=T){
for(intxs=0; xs<width; xs+=T){
for(intc=0; c<channel; c++){
for(inty=0; y<T; y++){
for(intx=0; x<T; x++){
f=0;
for (intv=0; v<K; v++){
for (intu=0; u<K; u++){
if (u==0){
Cu=1./sqrt(2);
                } else {
Cu=1;
                }
if (v==0){
Cv=1./sqrt(2);
                } else { 
Cv=1;
                }
f+=2./T*Cu*Cv*dct_s.coef[ys+v][xs+u][c] *cos((2.*x+1) *u*M_PI/2./T) *cos((2.*y+1) *v*M_PI/2./T);
              }
            }
f=fmin(fmax(f, 0), 255);
out.at<cv::Vec3b>(ys+y, xs+x)[c] = (uchar)f;
          }
        }
      }
    }
  }
returnout;
}
// Mainintmain(intargc, constchar*argv[]){
// read original imagecv::Matimg=cv::imread("lena.jpg", cv::IMREAD_COLOR);
// DCT coefficientdct_strdct_s;
// output imagecv::Matout=cv::Mat::zeros(height, width, CV_8UC3);
// DCTdct_s=dct(img, dct_s);
// IDCTout=idct(out, dct_s);
cv::imwrite("out.jpg", out);
//cv::imshow("answer", out);//cv::waitKey(0);cv::destroyAllWindows();
```Python代码如下:```pythonimportcv2importnumpyasnpimportmatplotlib.pyplotasplt# DCT hyoer-parameter 超参数T=8K=8channel=3# DCT weightdefw(x, y, u, v):
cu=1.cv=1.ifu==0:
cu/=np.sqrt(2)
ifv==0:
cv/=np.sqrt(2)
theta=np.pi/ (2*T)
return (( 2*cu*cv/T) *np.cos((2*x+1)*u*theta) *np.cos((2*y+1)*v*theta))
# DCTdefdct(img):
H, W, _=img.shapeF=np.zeros((H, W, channel), dtype=np.float32)
forcinrange(channel):
foryiinrange(0, H, T):
forxiinrange(0, W, T):
forvinrange(T):
foruinrange(T):
foryinrange(T):
forxinrange(T):
F[v+yi, u+xi, c] +=img[y+yi, x+xi, c] *w(x,y,u,v)
returnF# IDCTdefidct(F):
H, W, _=F.shapeout=np.zeros((H, W, channel), dtype=np.float32)
forcinrange(channel):
foryiinrange(0, H, T):
forxiinrange(0, W, T):
foryinrange(T):
forxinrange(T):
forvinrange(K):
foruinrange(K):
out[y+yi, x+xi, c] +=F[v+yi, u+xi, c] *w(x,y,u,v)
out=np.clip(out, 0, 255)
out=np.round(out).astype(np.uint8)
returnout# Read imageimg=cv2.imread("imori.jpg").astype(np.float32)
# DCTF=dct(img)
# IDCTout=idct(F)
# Save resultcv2.imshow("result", out)
cv2.waitKey(0)
cv2.imwrite("out.jpg", out)
目录
相关文章
|
18天前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
1月前
|
存储 算法 Serverless
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
46 0
|
1月前
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
35 0
|
1月前
|
自然语言处理 算法 C++
在C++语言中非修正算法
在C++语言中非修正算法
13 1
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 程序员
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
75 1
|
1月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
23 2
|
8天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。
|
1月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
48 0
|
18天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II