【发布时间】:2019-02-14 11:24:12
【问题描述】:
我想将Mat 标准化为最小值为 255,最大值为 0(在 0~255 之间标准化Mat)。
例如,如果我们在规范化后有一个像[0.02, 0.002, 0.0002] 这样的数组,我想得到这样的结果:[3, 26, 255],但现在当我使用NORM_MINMAX 时,我得到了[255, 26, 3]。
但是我没有找到任何函数来做NORM_MINMAX的反转操作。
使用的代码:
cv::Mat mat(10, 10, CV_64F);
mat.setTo(0);
mat.row(0) = 0.02;
mat.row(1) = 0.002;
mat.row(2) = 0.0002;
cv::normalize(mat, mat, 255, 0, cv::NORM_MINMAX);
mat.convertTo(mat, CV_8UC1);
std::cout << mat << std::endl;
结果是:
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255;
26, 26, 26, 26, 26, 26, 26, 26, 26, 26;
3, 3, 3, 3, 3, 3, 3, 3, 3, 3;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
但我想要上述结果的倒数。
更新:当我从垫子中减去 255 时:
cv::subtract(255, mat, mat, mat); // the last mat acts as mask
std::cout << mat << std::endl;
结果是:
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
229, 229, 229, 229, 229, 229, 229, 229, 229, 229;
252, 252, 252, 252, 252, 252, 252, 252, 252, 252;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
【问题讨论】:
-
Python 还是 C++ ?
-
@MarkSetchell c++
-
你可以在规范化后执行
result = 255-result之类的操作 -
@api55 问题已更新,但结果不是我想要的。
-
@BahramdunAdil api55 的答案是对的,而且有效
标签: opencv