如何在Vivado HLS中生成100x100的10阶灰度渐变图像?
在Vivado HLS中生成100×100 10阶灰度渐变图的实现方案
核心思路
Vivado HLS综合阶段仅支持静态一维数组,因此先创建对应100×100尺寸的一维数组,将图像按行划分为10个区域(每个区域10行),每个区域对应一个从白到黑的灰度阶;仿真验证阶段可将一维数组转换为OpenCV的Mat格式,用于可视化或保存图像。
1. 确定灰度阶值
从白(255)到黑(0)均分10阶,通过255 - (i * 255 / 9)计算(i从0到9),得到10个灰度值:255, 227, 200, 172, 145, 117, 90, 62, 35, 0。
2. Vivado HLS综合可执行的核心代码
这部分代码可被HLS综合,仅使用一维数组:
#include <ap_int.h> // 定义图像尺寸常量 #define WIDTH 100 #define HEIGHT 100 #define TOTAL_PIXELS WIDTH * HEIGHT // 生成灰度渐变图像的函数 void generate_gradient_img(unsigned char img_array[TOTAL_PIXELS]) { // 预定义10阶灰度值(从白到黑) unsigned char gray_levels[10] = {255, 227, 200, 172, 145, 117, 90, 62, 35, 0}; // 遍历每一行填充像素 for (int row = 0; row < HEIGHT; row++) { // 确定当前行所属灰度阶(每10行对应一个阶) int level_idx = row / 10; unsigned char current_gray = gray_levels[level_idx]; // 填充当前行的所有像素 for (int col = 0; col < WIDTH; col++) { int idx = row * WIDTH + col; img_array[idx] = current_gray; } } }
3. 仿真验证:一维数组转OpenCV Mat并保存
在Testbench中使用OpenCV将一维数组转换为Mat并保存图像,用于验证结果:
#include <opencv2/opencv.hpp> #include "generate_gradient_img.h" int main() { unsigned char img_array[TOTAL_PIXELS]; // 调用生成函数 generate_gradient_img(img_array); // 将一维数组转换为Mat格式 cv::Mat img(HEIGHT, WIDTH, CV_8UC1); for (int row = 0; row < HEIGHT; row++) { for (int col = 0; col < WIDTH; col++) { img.at<unsigned char>(row, col) = img_array[row * WIDTH + col]; } } // 保存图像到本地 cv::imwrite("10level_gradient.png", img); return 0; }
关键注意事项
- Vivado HLS综合阶段不支持OpenCV的
Mat类型,核心生成逻辑必须仅使用一维数组,Mat仅用于Testbench的仿真验证。 - 若生成的图像用于硬件后续处理,可直接将一维数组作为硬件接口的输出。
- 灰度阶值可根据需求调整,比如改用近似均分的整数步长(如
255 - i*26)。
内容的提问来源于stack exchange,提问作者Тёма Ершов
相关产品推荐
相关产品推荐

