如何在opencv中将图像从CV_8UC1转换为CV_32FC1类型?

Posted

技术标签:

【中文标题】如何在opencv中将图像从CV_8UC1转换为CV_32FC1类型?【英文标题】:How to convert an image from CV_8UC1 to CV_32FC1 type in opencv? 【发布时间】:2015-05-21 11:09:09 【问题描述】:

我读取了一个类型为 CV_8UC1 的图像,我想将其转换为 CV_32FC1。但是当我使用 convertTO() 函数时,我的图像变得完全白色,我不知道为什么!

Mat Image(512,512,CV_32FC1);     
Image = imread("C:\\MGC.jpg",CV_LOAD_IMAGE_GRAYSCALE);   

/// show image
namedWindow("pic");
int x = 0; int y = 0;
imshow("pic", Image);

cout<<Image.type()<<endl;
Image.convertTo(Image,CV_32FC1);
cout<<Image.type()<<endl;

////show converted image 
namedWindow("pic1");
imshow("pic1",Image );

【问题讨论】:

顺便说一句,你的初始图像(512,512,CV_32FC1);分配只会被 inread 覆盖。把它留空。 【参考方案1】:

因为 32FC 类型元素图像的可显示范围是 [0:1](对于 imshow)。 试试这个。

Image.convertTo(Image,CV_32FC1, 1.0/255.0);

【讨论】:

Smorodov :谢谢您的回复。它工作正常。我还有一个问题。如果我更改一些像素,如何再次将其转换为 CV_8UC1 类型?我使用 Image.convertTo(Image,CV_8UC1) 但它变成了全黑。 Image.convertTo(Image,CV_8UC1, 255.0); 必须导入哪个模块才能进行此转换?【参考方案2】:

Andrey 使用的方法在当前 (v3.4) opencv for python 中似乎不存在。 这是使用 scikit-image 的替代解决方案

http://scikit-image.org/docs/dev/user_guide/data_types.html

 import cv2
 from skimage import img_as_float

 cap = cv2.VideoCapture(0)

 ret, frame = cap.read()

 image1  = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

 image2 = img_as_float(image1)

 cv2.imshow('IMAGE1',image1)
 cv2.imshow('IMAGE2', image2)

 while(1):
     k = cv2.waitKey(100) & 0xff
     if k == 27:
        break

 cap.release()
 cv2.destroyAllWindows()

【讨论】:

【参考方案3】:

这是一个缩放问题。 cvtColor 在数据类型的范围内很棘手。阅读此here。

如果您从CV_8U 更改为CV32F 并且范围不能自行缩放,则必须指明缩放度量。

【讨论】:

以上是关于如何在opencv中将图像从CV_8UC1转换为CV_32FC1类型?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 转换慢

将图像从 CV_64F 转换为 CV_8U

如何将 cv::Mat 类型从 CV_16UC1 转换为 CV_8UC1

如何正确将 cv::Mat 转换为 CV_8UC1?

如何将OpenCV Mat的所有像素设置为特定值?

OpenCV——图像的深度与通道数讲解