【问题标题】:OpenCV : Convert a CV_8UC3 image to a CV_32S1 image in C++OpenCV:在 C++ 中将 CV_8UC3 图像转换为 CV_32S1 图像
【发布时间】:2013-02-26 06:00:39
【问题描述】:

我需要将具有 3 个通道的 CV_8U 图像转换为必须是单通道 CV_32S 的图像。但是当我尝试这样做时,我得到的图像全是黑色的。我不明白为什么我的代码不起作用。

我正在处理灰度图像,这就是为什么我将 3 通道图像拆分为单通道图像的向量,然后只处理第一个通道。

//markers->Image() returns a valid image, so this is not the problem

cv::Mat dst(markers->Image().size(), CV_32SC1);
dst = cv::Scalar::all(0);
std::vector<cv::Mat> vectmp;
cv::split(markers->Image(), vectmp);
vectmp.at(0).convertTo(dst, CV_32S);

//vectmp.at(0) is ok, but dst is black...?

提前谢谢你。

【问题讨论】:

  • 为什么不先进行灰度转换,考虑所有三个颜色通道?

标签: c++ opencv type-conversion mat watershed


【解决方案1】:

您是否尝试过获取结果图像的值?像这样:

for (int i=0; i<result.rows; i++)
{
    for (int j=0; j<result.cols; j++)
    {
        cout << result.at<int>(i,j) << endl;
    }
}

我已将(也使用convertTo)随机灰度单通道图像转换为CV_32S(它是每个像素的有符号32位整数值)我的输出是这样的:

80
111
132

当我尝试显示它时,我也得到黑色图像。来自documentation

如果图像是 16 位无符号或 32 位整数,则像素为 除以256。即取值范围[0,255*256]映射到 [0,255]。

因此,如果您将这些小数除以 255,您将得到 0(int 类型)。这就是imshow 显示黑色图像的原因。

【讨论】:

    【解决方案2】:

    如果要显示 32 位图像并查看有意义的结果,则需要在调用 imshow 之前将其所有元素乘以 256。否则,imshow 会将您的值缩小到零,您将获得黑色图像(正如 Astor 指出的那样)。

    由于原始值是 8 位无符号的,它们必须小于 255。因此将它们乘以 256 是安全的,不会溢出 32 位整数。

    EDIT 我刚刚意识到您的输出类型是有符号 32 位整数,但原始类型是无符号 8 位整数。在这种情况下,您需要适当地调整您的值(查看scaleAdd)。

    最后,在开始丢弃图像通道之前,您可能需要确保图像是 YCbCr 格式。

    【讨论】:

      【解决方案3】:

      我有同样的问题,通过尝试将 8UC1 转换为 32S 而不是 8UC3 来间接解决。

      RgbToGray 接受使用 8UC3 或 8UC1 元素类型创建灰度图像。 8UC1 图像是我的标记图像。

      我已经在 Opencvsharp 中完成了这个:

      Mat buf3 = new Mat(iplImageMarker);
      buf3.ConvertTo(buf3, MatType.CV_32SC1);
      iplImageMarker= (IplImage)buf3;
      
      iplImageMarker=iplImageMarker* 256;
      

      【讨论】:

        【解决方案4】:

        我相信这就是您正在寻找的。将您的图像转换为此 8 位单通道。 CV_8UC1。您从 8 位图像开始并将其更改为 32 位单通道?为什么?保持 8 位。

        【讨论】:

          猜你喜欢
          • 2016-01-03
          • 2017-08-27
          • 1970-01-01
          • 2011-11-29
          • 2011-03-02
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多