为什么我无法正确转换为 8UC3?
Why can't I convert to 8UC3 correctly?
即使
我的输入图像是 16 位,我也想以 8 位执行轮廓。给定 raw
类型的 16UC3
的输入图像,我找到每个通道的最小值/最大值
double min, max;
double min0, max0;
double min1, max1;
double min2, max2;
cv::minMaxLoc(raw, &min, &max);
cv::minMaxLoc(channel(raw,0), &min0, &max0);
cv::minMaxLoc(channel(raw,1), &min1, &max1);
cv::minMaxLoc(channel(raw,2), &min2, &max2);
fprintf(stderr, "max = %f %f %f %f!n", max, max0, max1, max2);
其中channel
由
cv::Mat channel(cv::Mat A, int ich) {
cv::Mat C[3];
for(int i = 0; i < 3; i++) {
C[i] = cv::Mat::zeros( cv::Size(A.rows, A.cols), A.type());
}
cv::split(A, C);
return C[ich];
}
然后,我尝试创建一个 8 位图像
cv::Mat raw256(raw.clone());
raw.convertTo(raw256, CV_8UC3);
但是当我打印出相同的信息时:
cv::minMaxLoc(raw256, &min, &max);
cv::minMaxLoc(channel(raw256,0), &min0, &max0);
cv::minMaxLoc(channel(raw256,1), &min1, &max1);
cv::minMaxLoc(channel(raw256,2), &min2, &max2);
我得到非常不同的结果,如图所示:
max = 29952.000000 0.000000 29952.000000 26880.000000!
max = 255.000000 0.000000 255.000000 255.000000!
这也会导致我的程序后面出现段错误。我在构建正在改变价值观的raw256
中做错了什么?
convertTo
将使>255
到255
的所有值饱和。这就是为什么你会看到那些奇怪的价值观。
您可以将convertTo
与适当的缩放一起使用:
raw.convertTo(raw256, CV_8U, 1. / 256.);
实际上,这将首先将raw
值转换为范围[0, 255]
,然后安全地将它们转换为CV_8U
。
请注意,您还可以使用 normalize
:
normalize(raw, raw256, 0, 255, NORM_MINMAX);
这将使 raw
中的最小值变为 0,最高值变为 255
,其他值将相应地缩放。
附带说明一下,您不需要预先分配OutputArray
s,因此您可以像这样编写channel
:
cv::Mat channel(cv::Mat A, int ich) {
cv::Mat C[3];
cv::split(A, C);
return C[ich];
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 从 16UC3 到 8UC3 的高性能 OpenCV 矩阵转换
- 为什么我无法正确转换为 8UC3?