【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)
相关文章
|
6月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
153 2
|
7月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
8月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
231 15
|
8月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
3月前
|
算法 芯片 Python
使用变动和观察(Perturb and Observe)最大功率点跟踪(MPPT)算法控制升压变换器的MOSFET/IGBT(开关),以从光伏阵列中提取最大功率(Simulink仿真实现)
使用变动和观察(Perturb and Observe)最大功率点跟踪(MPPT)算法控制升压变换器的MOSFET/IGBT(开关),以从光伏阵列中提取最大功率(Simulink仿真实现)
198 1
|
8月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
4月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
138 0
|
6月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
178 17
|
5月前
|
存储 机器学习/深度学习 算法
基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
146 4
|
6月前
|
算法 数据处理 数据安全/隐私保护
基于投影滤波算法的rick合成地震波滤波matlab仿真
本课题基于MATLAB2022a实现对RICK合成地震波的滤波仿真,采用投影滤波与卷积滤波投影两种方法处理合成地震剖面。地震波滤波是地震勘探中的关键步骤,用于去噪和增强信号。RICK模型模拟实际地震数据,投影滤波算法通过分解信号与噪声子空间实现有效去噪。完整程序运行无水印,包含核心代码与理论推导,适用于地震数据处理研究及学习。

热门文章

最新文章