cv cpp 归一化 rgb 图片
2019-05-05 本文已影响0人
谢小帅
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
// define an array
static const float norm_means[] = {0.406, 0.456, 0.485};
static const float norm_stds[] = {0.225, 0.224, 0.229};
int main() {
// read img
cv::Mat src = cv::imread("/home/nvidia/CLionProjects/BiSeNet/img/lab/rgb/0.jpg");
src.convertTo(src, CV_32F); // default uchar -> float32
src /= 255; // divide to [0, 1]
// As mean changes when / std, we can't get mean and std here.
vector<cv::Mat> channels;
cv::split(src, channels); // split to R, G, B
cv::Scalar means, stds; // store mean,std of each channel
for (int i = 0; i < 3; ++i) {
cv::Mat a = channels[i]; // b
cv::meanStdDev(a, means, stds); // compute mean,std
a = a / stds.val[0] * norm_stds[i]; // change std, mean also change
means = cv::mean(a); // recompute mean!
a = a - means.val[0] + norm_means[i]; // move distribution
channels[i] = a;
}
// test result
cv::Mat norm_src;
cv::merge(channels, norm_src); // merge channels to bgr
cv::meanStdDev(norm_src, means, stds);
for (int i = 0; i < 3; ++i) {
cout << means.val[i] << ", " << stds.val[i] << endl;
}
return 0;
}
0.406, 0.225
0.456, 0.224
0.485, 0.229