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

10

我读取了一张图像,它的类型是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 );

1
顺便提一下,你最初的Image(512,512,CV_32FC1)分配将被inread覆盖。只需将其保留为空即可。 - berak
3个回答

10

因为32FC类型元素图像的显示范围是[0:1](用于imshow),请尝试此操作。

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

Smorodov: 谢谢您的回复。它正常工作了。我还有一个问题。如果我更改一些像素,如何将其再次转换为CV_8UC1类型? 我使用了Image.convertTo(Image,CV_8UC1),但它变成了完全黑色。 - N_Kh
6
Image.convertTo(Image, CV_8UC1, 255.0); - Andrey Smorodov
需要导入哪个模块才能进行此转换? - Samarth Kejriwal

0

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

如果您从CV_8U更改为CV32F,并且范围本身不会自动缩放,则必须指定缩放措施。


0
Andrey使用的方法似乎在当前(v3.4)Python OpenCV中不存在。 这里有一个替代方案,它使用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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接