当前位置: 首页 > news >正文

滤波测试激励编写

一、测试激励编写

#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>
#include "hls_stream.h"
#include "ap_int.h"


#include "bil_filter.h"

// ------------------------- 娴嬭瘯鍙傛暟 -------------------------
#define TEST_ROWS 1080
#define TEST_COLS 1920
#define TEST_NPPC 4

// --------------------------------------------------
void bilateral_filter_software(
const cv::Mat& src, cv::Mat& dst,
float sigma_s, float sigma_r)
{
dst.create(src.size(), src.type());
int radius = 2;

// 棰勮绠楃┖闂存潈閲�
float space_w[5][5];
for (int i = -radius; i <= radius; i++) {
for (int j = -radius; j <= radius; j++) {
space_w[i+radius][j+radius] = exp(-(i*i + j*j) / (2.0 * sigma_s * sigma_s));
}
}

// 棰勮绠楀�煎煙鏉冮噸
float range_w[256];
for (int i = 0; i < 256; i++) {
range_w[i] = exp(-(i*i) / (2.0 * sigma_r * sigma_r));
}

// 婊ゆ尝璁$畻 (鍖呭惈杈圭晫闀滃儚澶勭悊)
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
float sum_w = 0.0;
float sum_v = 0.0;

for (int r = -radius; r <= radius; r++) {
for (int c = -radius; c <= radius; c++) {

int nr = std::abs(i + r);
int nc = std::abs(j + c);
if (nr >= src.rows) nr = 2 * src.rows - nr - 2;
if (nc >= src.cols) nc = 2 * src.cols - nc - 2;

uchar neighbor = src.at<uchar>(nr, nc);
uchar center = src.at<uchar>(i, j);

int diff = abs(center - neighbor);
float w = space_w[r+radius][c+radius] * range_w[diff];

sum_w += w;
sum_v += neighbor * w;
}
}
dst.at<uchar>(i, j) = cv::saturate_cast<uchar>(sum_v / sum_w + 0.5f);
}
}
}

// ------------------------- -------------------------
int main() {
std::cout << ">>> Start Bilateral Filter Testbench <<<" << std::endl;

// 1.
cv::Mat src_img = cv::imread("gray_img.png", cv::IMREAD_GRAYSCALE);
if (src_img.empty()) {
std::cerr << "Error: Cannot load input.png! Generating a synthetic image." << std::endl;
src_img.create(TEST_ROWS, TEST_COLS, CV_8UC1);
cv::randu(src_img, 0, 256); //
}

cv::resize(src_img, src_img, cv::Size(TEST_COLS, TEST_ROWS));

const int COLS_BLOCK = TEST_COLS / TEST_NPPC;

// 2.
weight_t space_weight[25];
weight_t range_weight[256];
float sigma_s = 2.0f;
float sigma_r = 30.0f;

for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
float val = exp(-((i-2)*(i-2) + (j-2)*(j-2)) / (2.0 * sigma_s * sigma_s));
space_weight[i*5 + j] = (weight_t)val;
}
}
for (int i = 0; i < 256; i++) {
float val = exp(-(i*i) / (2.0 * sigma_r * sigma_r));
range_weight[i] = (weight_t)val;
}

// 3. 澹版槑 AXI-Stream
hls::stream< ap_uint<8*TEST_NPPC> > src_stream("src_stream");
hls::stream< ap_uint<8*TEST_NPPC> > dst_stream("dst_stream");

// 4. 灏� OpenCV 鏁版嵁鍐欏叆杈撳叆娴� (鎵撳寘)
for (int i = 0; i < TEST_ROWS; i++) {
for (int j = 0; j < COLS_BLOCK; j++) {
ap_uint<8*TEST_NPPC> pkt = 0;
for (int k = 0; k < TEST_NPPC; k++) {
uchar pix = src_img.at<uchar>(i, j * TEST_NPPC + k);
pkt(8*(k+1)-1, 8*k) = pix; // 浣庝綅鏀惧墠涓�涓儚绱狅紝楂樹綅鏀惧悗涓�涓儚绱�
}
src_stream.write(pkt);
}
}

// 5. 璋冪敤寰呮祴纭欢妯″潡
std::cout << "Running HLS Hardware Model..." << std::endl;



bilateral_top(src_stream, dst_stream, space_weight, range_weight);


// 6.
cv::Mat hw_dst_img(TEST_ROWS, TEST_COLS, CV_8UC1);

for (int i = 0; i < TEST_ROWS; i++) {
for (int j = 0; j < COLS_BLOCK; j++) {
ap_uint<8*TEST_NPPC> pkt = dst_stream.read();
for (int k = 0; k < TEST_NPPC; k++) {
hw_dst_img.at<uchar>(i, j * TEST_NPPC + k) = pkt(8*(k+1)-1, 8*k);
}
}
}

// 7.
std::cout << "Running Software Reference Model..." << std::endl;
cv::Mat sw_dst_img;
bilateral_filter_software(src_img, sw_dst_img, sigma_s, sigma_r);

// 8.
int err_count = 0;
int max_err = 0;
double total_sq_err = 0.0;

for (int i = 0; i < TEST_ROWS; i++) {
for (int j = 0; j < TEST_COLS; j++) {
int hw_val = hw_dst_img.at<uchar>(i, j);
int sw_val = sw_dst_img.at<uchar>(i, j);
int diff = abs(hw_val - sw_val);

if (diff > 2) {
err_count++;
}
if (diff > max_err) {
max_err = diff;
}
total_sq_err += (diff * diff);
}
}

double mse = total_sq_err / (TEST_ROWS * TEST_COLS);
double psnr = (mse == 0) ? 100.0 : 10.0 * log10(255.0 * 255.0 / mse);

// std::cout << "------ Verification Results ------" << std::endl;
// std::cout << "Max Absolute Error: " << max_err << std::endl;
// std::cout << "Error Count (>2): " << err_count << " / " << TEST_ROWS*TEST_COLS << std::endl;
// std::cout << "PSNR: " << psnr << " dB" << std::endl;


cv::imwrite("hw_output.png", hw_dst_img);
cv::imwrite("sw_output.png", sw_dst_img);

std::cout << "Images saved to hw_output.png and sw_output.png" << std::endl;


// if (max_err <= 3 && psnr > 35.0) {
// std::cout << ">>> TEST PASSED <<<" << std::endl;
// return 0;
// } else {
// std::cout << ">>> TEST FAILED <<<" << std::endl;
// return 1;
// }

return 0;
}

上述代码是测试激励的编写

二、核心代码设计

http://www.zskr.cn/news/1357917.html

相关文章:

  • 学术赋能国际交流 实干彰显时代担当——刘庆武受聘泰国清迈西北大学国际金融类博士生导师
  • PDF怎么转Word、Excel、图片?2026年免费PDF转换软件推荐对比 - AI测评专家
  • Hotkey Detective:3分钟找出Windows热键冲突的终极指南
  • :武汉黄金回收口碑排行榜本地人真实推荐 - 润富黄金珠宝行
  • Loklak Tweet Heatmap安全配置指南:API调用限制与数据隐私保护
  • Pandoc终极指南:如何用免费工具实现60+种文档格式一键转换
  • Overleaf快速入门笔记
  • GEO工具红黑榜:有的在“监测“,有的在“收智商税“
  • 如何用Playnite打造你的终极游戏库:统一管理Steam、Epic、GOG等20+平台游戏
  • 如何用Playnite打造终极游戏库:统一管理20+平台游戏
  • 知识竞赛选手心理建设:如何应对紧张和压力
  • 2026宁波添价收钻石回收 精细检测估价公道安心完成交易 - 薛定谔的梨花猫
  • 观察Taotoken用量看板如何帮助团队清晰掌控API成本
  • 2026年最新!杭州窗帘定制性价比之王:帘上门窗帘厂家直销,让您花少钱装好帘 - 资讯纵览
  • FPGA硬件DNA解码器:PrjXRay如何用模糊测试揭开Xilinx 7系列芯片的内部秘密
  • “渐变=平滑过渡”是最大误区!资深AI艺术总监拆解11种非线性渐变类型及对应--style参数矩阵
  • Translumo:3分钟掌握Windows平台终极实时屏幕翻译解决方案
  • Phoenix完全指南:Android平台一站式图片/视频处理解决方案详解
  • 如何彻底解决显卡驱动问题:Display Driver Uninstaller完整使用指南
  • 2026年昆明全屋定制源头工厂盘点:适配多元需求的实力参考 - 兔兔不是荼荼
  • 混合数据聚类算法实战:k-prototypes深度解析与应用
  • NNVM编译器核心功能解析:优化、转换与部署全流程
  • 微信好友偷偷删了你?三步教你一键检测单向好友关系
  • 装配骨架:每一帧重新构建简笔人物,文本围绕当前姿势环绕显示
  • 如何用5分钟掌握Windows上最高效的屏幕标注工具ppInk?
  • 3步快速部署的i茅台自动预约终极解决方案
  • D3plus数学工具:几何计算和数据处理实用函数终极指南 [特殊字符]
  • 2026免费PDF转换器对比推荐:如何选择最适合的工具? - 软件小管家
  • 如何用Ryujinx模拟器在电脑上免费畅玩Switch游戏:新手完整指南
  • Taotoken模型广场功能体验,一站式比较与选择最适合的大模型