【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)
目录
相关文章
|
2天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
7天前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
31 4
|
4月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
158 1
|
3月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
54 0
|
3月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
3月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
4月前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
103 0
|
4月前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
153 0
|
4月前
|
算法 数据安全/隐私保护 C++
超级好用的C++实用库之MD5信息摘要算法
超级好用的C++实用库之MD5信息摘要算法
105 0
|
5月前
|
算法 C++ 容器
C++标准库中copy算法的使用
C++标准库中copy算法的使用
44 1