如何在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类型?的主要内容,如果未能解决你的问题,请参考以下文章