C++ MathGL 二维数据绘图

C++ MathGL环境搭建参考

https://blog.youkuaiyun.com/vaincury/article/details/105438971

MathGL官网

http://mathgl.sourceforge.net/doc_en/index.html

2D绘图没有直接的例子,只能逐条语句摸索。

分别初始化并设置数据类和绘图类

类mglData包含MathGL中用于数据处理的所有函数,它不依赖于具体的数据类型,数据数组的大小与数据一起保存,内存工作更简单和更安全。
创建2D数据,首先指定数据的大小,即行列数,mglData中数据是平面的,所以要逐个线性填充,例如下,但是行列好像是颠倒的,结果不理想就陶正一下。

mglData z(30,40);
  for(int i=0;i<30;i++)   for(int j=0;j<40;j++)
    z.a[i+30*j] = sin(M_PI*i/29.)*sin(M_PI*j/39.);

MathGL通常有两种绘图函数。这里使用简单变量,需要一个数据数组来绘图,其他数据(坐标)被认为是均匀分布在坐标轴范围内。
然后准备图幅,使用mglGraph类。注意一顶要旋转一下,才能得到立体的效果。

 	gr.SetRanges(minx , maxx ,  maxy ,miny , 30, 45);//坐标轴范围
    gr.Rotate(60, 45);//旋转
    gr.Axis();//显示坐标轴
    gr.Box();//显示图片边框
    //gr.Title("d72 v1.2 p5 tz");
    //Plot、Barh、Mark等等可选 
    gr.Surf(z1);
    gr.Cont(z1, "y");	// 黄色曲线
    //保存图片
    gr.WritePNG("test.png");  // Don't forget to save the result!
注意,这个库有bug,我一直不知道原因,我的电脑作图,如果加了标题,整个图出来时乱的。

效果

在这里插入图片描述

### 关于C++中的图像标准化方法和库 #### 图像标准化的概念 图像标准化是一种常见的图像预处理技术,旨在将输入图像调整到统一的标准范围或形式。这一步骤对于后续的图像分析、特征提取以及机器学习模型训练至关重要[^1]。 --- #### 使用OpenCV实现图像标准化 OpenCV 是一个功能强大且广泛应用的计算机视觉库,在 C++ 中可以通过 OpenCV 轻松实现图像标准化操作。以下是具体实现方法: ##### 归一化至 [0, 1] 或 [-1, 1] 通过 `cv::normalize` 函数可以方便地将图像像素值归一化到指定范围内: ```cpp #include <opencv2/opencv.hpp> int main() { // 加载图像 cv::Mat src = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE); if (src.empty()) return -1; // 定义目标矩阵 cv::Mat normalizedImage; // 将图像归一化到 [0, 1] cv::normalize(src, normalizedImage, 0, 1, cv::NORM_MINMAX, CV_32F); // 可视化结果 cv::imshow("Normalized Image", normalizedImage * 255); // 放大回 [0, 255] 显示 cv::waitKey(0); return 0; } ``` 此代码片段展示了如何利用 OpenCV 的 `cv::normalize` 函数对灰度图像进行归一化处理[^2]。 --- #### 基于 Boost 和自定义算法的图像标准化 如果需要更灵活的控制,也可以借助 Boost 库或其他数学工具来手动实现图像标准化逻辑。例如,假设我们需要按以下公式对图像进行标准化: \[ \text{normalized\_pixel} = \frac{\text{original\_pixel} - \min(\text{image})}{\max(\text{image}) - \min(\text{image})} \] 可以编写如下代码: ```cpp #include <boost/multi_array.hpp> #include <iostream> #include <vector> #include <algorithm> void normalizeImage(const std::vector<std::vector<float>>& input, std::vector<std::vector<float>>& output) { float minVal = *std::min_element(input.begin(), input.end()); float maxVal = *std::max_element(input.begin(), input.end()); for (size_t i = 0; i < input.size(); ++i) { output.push_back({}); for (size_t j = 0; j < input[i].size(); ++j) { output[i].push_back((input[i][j] - minVal) / (maxVal - minVal)); } } } int main() { // 示例二维数组表示的图像数据 std::vector<std::vector<float>> image = {{10, 20}, {30, 40}}; std::vector<std::vector<float>> normalizedImage; normalizeImage(image, normalizedImage); // 输出结果 for (const auto& row : normalizedImage) { for (float val : row) { std::cout << val << " "; } std::cout << "\n"; } return 0; } ``` 该示例使用了 STL 和 Boost 提供的功能来完成简单的图像标准化任务[^3]。 --- #### 利用 mathGL 进行图像标准化后的可视化 在某些情况下,可能还需要对标准化后的图像进行进一步的可视化分析。此时可以结合 mathGL 来绘制统计图表或热力图。例如: ```cpp #include <mgl2/mgl.h> int main() { mglGraph gr; // 设置标题和坐标轴范围 gr.Title("Standardized Image Visualization"); gr.SetRanges(-1, 1, -1, 1); // 绘制标准化后的图像分布(模拟) double data[100]; for (int i = 0; i < 100; ++i) { data[i] = sin(i * 0.1) / cos(i * 0.1 + 1e-6); // 模拟标准化数据 } gr.Plot(data, 100, "b"); // 导出图片 gr.WriteFrame("standardization_result.png"); return 0; } ``` 这段代码演示了如何使用 mathGL 对经过标准化的数据进行绘图显示[^4]。 --- #### 总结 在 C++ 中实现图像标准化有多种途径,其中最常见的是通过 OpenCV 提供的内置函数快速完成任务;而当需求更加复杂时,则可以选择引入 Boost 等第三方库来自定义解决方案。最后,可视化的辅助工具如 mathGL 可帮助验证标准化效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值