【问题标题】:How to convert image deep(CV_8UC3) in opencv?如何在opencv中转换图像深度(CV_8UC3)?
【发布时间】:2016-01-03 03:39:40
【问题描述】:
#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv){

      Mat img = imread("Nature.jpg"); // Read image from file
      Mat img_chn;

      img.convertTo(img_chn,CV_16UC3);

      imshow("Changed image", img_chn);  //show the changed image
      imshow("Original İmage", img); //show the original image

      waitKey(0); // Wait until user press some key
      return 0;
}

当我运行此代码时,我在更改的图像窗口中看到黑屏。如果我写 CV_8UC3 而不是 CV_16UC3 则不会出现问题。

我的目的是将8位图像转换为16位图像,我该怎么办?

【问题讨论】:

    标签: opencv


    【解决方案1】:

    这种行为是正确的。

    img_chn 已正确初始化,您只是看不到它,因为imshow 会将 CV_16U 图像除以 256,因此您的图像将显示为黑色(因为 img_chn 中的所有值都是 &lt;= 255)。

    如果您将图像转换为CV_16U,将值从 [0,255] 放大到 [0,255*256]:

    img.convertTo(img_chn,CV_16UC3, 256);
    

    你会正确看到图像。

    【讨论】:

    • 谢谢,如果我想转换成 32 位,我必须写什么? img.convertTo(img_chn,CV_16UC3, ###);
    • 如果你的意思是浮点值CV_32F,你需要值在[0,1],所以img.convertTo(img_chn, CV_32F, 1.0 / 255.0);
    • @Berkay 正确的图像是 8U、16U 或 32F,并且 imshow scales 仅正确显示这些格式。您显然可以拥有一个 32S 的矩阵,但您需要将其转换(适当缩放)为上述格式之一才能正确显示。
    • @Berkay 如果这回答了您的原始问题,请接受。如果您还有与此无关的问题,您应该创建一个新答案。如果您对此答案不满意,请告诉我
    猜你喜欢
    • 2013-02-26
    • 2020-04-25
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多