C++ 使用最小值和最大值缩放Mat中的每个单元格
我找不出一个函数来使用给定的范围缩放cv::Mat中的所有单元格。这似乎是一个非常有用的函数,还是我应该手动迭代矩阵来实现它C++ 使用最小值和最大值缩放Mat中的每个单元格,c++,opencv,C++,Opencv,我找不出一个函数来使用给定的范围缩放cv::Mat中的所有单元格。这似乎是一个非常有用的函数,还是我应该手动迭代矩阵来实现它 我实际上想做的是为CvSVM扩展训练数据。每一列都有各自的原因范围。没有内置函数来实现这一点,但可以通过在每一列上应用参数NORM\u MINMAX轻松实现 参见示例,其中,数据是原始数据,缩放是缩放输出,其中每个列在范围[0,1]内独立标准化: #include <opencv2/opencv.hpp> #include <iostream> u
我实际上想做的是为CvSVM扩展训练数据。每一列都有各自的原因范围。没有内置函数来实现这一点,但可以通过在每一列上应用参数
NORM\u MINMAX
轻松实现
参见示例,其中,数据
是原始数据,缩放
是缩放输出,其中每个列在范围[0,1]
内独立标准化:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat1f data = (Mat1f(3, 4) << 0.1f, 2.f, 30.f, 500.f,
0.55f, 22.f, 330.f, 5500.f,
1.f, 12.f, 3030.f, 50500.f);
float out_min = 0.f;
float out_max = 1.f;
Mat1f scaled(data.rows, data.cols, 0.f);
for (int c = 0; c < data.cols; ++c)
{
normalize(data.col(c), scaled.col(c), out_min, out_max, NORM_MINMAX);
}
cout << scaled << endl;
// Scaled data:
// 0.0 0.0 0.0 0.0
// 0.5 1.0 0.1 0.1
// 1.0 0.5 1.0 1.0
return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
Mat1f data=(Mat1f(3,4)这可以通过调用normType=NORM\u INF
来完成
例如:
cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
5.f, 6.f, 7.f, 8.f);
cv::Mat res;
cv::normalize(data, res, 1, 0, cv::NORM_INF); // scale to [0,1]
std::cout << res;
编辑:与Miki的方法类似,如果希望每列的范围不同,则需要在每列上进行编辑
假设您要将其缩放到第列的[0,i]
:
cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
5.f, 6.f, 7.f, 8.f);
cv::Mat res(data.size(), data.type());
for (int i = 0; i < data.cols; ++i) {
cv::normalize(data.col(i), res.col(i), i+1, 0, cv::NORM_INF); // scale to [0,i+1]
}
std::cout << res;
cv::Mat data = (cv::Mat_<float>(2, 4) << 1.f, 2.f, 3.f, 4.f,
5.f, 6.f, 7.f, 8.f);
cv::Mat res(data.size(), data.type());
for (int i = 0; i < data.cols; ++i) {
cv::normalize(data.col(i), res.col(i), i+1, 0, cv::NORM_INF); // scale to [0,i+1]
}
std::cout << res;
[0.2, 0.66666669, 1.2857143, 2;
1, 2, 3, 4]