【问题标题】:Why can't I convert to 8UC3 correctly?为什么我不能正确转换为 8UC3?
【发布时间】:2016-08-15 02:49:17
【问题描述】:

即使我的输入图像是 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 时做错了什么,这正在改变值?

【问题讨论】:

    标签: c++ opencv type-conversion


    【解决方案1】:

    convertTo 将饱和所有值 &gt;255255。这就是为什么你会看到那些奇怪的值。

    您可以使用convertTo 进行适当的缩放:

    raw.convertTo(raw256, CV_8U, 1. / 256.);
    

    这实际上将首先将您的raw 值转换为[0, 255] 范围,然后将它们安全地转换为CV_8U

    注意你也可以使用normalize:

    normalize(raw, raw256, 0, 255, NORM_MINMAX);
    

    这会将raw 中的最小值设为0,将最高值设为255,其他值相应调整。


    附注,你不需要预先分配OutputArrays,所以你可以这样写channel

    cv::Mat channel(cv::Mat A, int ich) {
        cv::Mat C[3];
        cv::split(A, C); 
        return C[ich];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多