将图像从 CV_64F 转换为 CV_8U

Posted

技术标签:

【中文标题】将图像从 CV_64F 转换为 CV_8U【英文标题】:convert image from CV_64F to CV_8U 【发布时间】:2018-02-25 21:17:53 【问题描述】:

我想在 Python 中使用 OpenCV 将 CV_64FC1 类型的图像转换为 CV_8UC1

在 C++ 中,使用convertTo 函数,我们可以使用以下代码sn-p轻松转换图像类型:

image.convertTo(image, CV_8UC1);

我在互联网上搜索过,但找不到任何没有错误的解决方案。 Python OpenCV 中的任何函数可以转换它吗?

【问题讨论】:

你看过cv2.cvtColor吗? 我认为 cv2.cvtColor 用于色彩空间转换。我也可以用它来转换图片类型吗? numpy uint8 pixel wrapping solution的可能重复 @rayryeng 这个问题是关于使用 Python OpenCV 从 double 类型转换为 uint8 类型,使用以下答案解决,您提到的问题有不同的问题陈述。 带有 OpenCV 的 Python 使用 numpy 数组作为基本数据类型。链接的答案更通用,因为它在转换之前 剪辑 数组。下面的答案没有这样做,因此,可能会发生溢出。 【参考方案1】:

对于出现黑屏或大量噪点的用户,您需要先对图像进行标准化,然后再转换为 8 位。这是直接使用 numpy 完成的,因为 OpenCV 使用 numpy 数组作为其图像。

在我的例子中,在标准化之前,图像的范围是从 4267.0-4407.0。 现在规范化:

# img is a numpy array/cv2 image
img = img - img.min() # Now between 0 and 8674
img = img / img.max() * 255

现在图像在 0 到 255 之间,我们可以转换为 8 位整数。

new_img = np.uint8(img)

这也可以通过img.astype(np.uint8)来完成。

【讨论】:

第二条语句中,需要将img除以img.max() - img.min() @AdityaVerma 这不是必需的,因为img.min() 0,所以img.max() - img.min()img.max() 相同。这是因为我减去了img.min(),所以图像在0到8674之间。 是的,你是对的。您实际上是在第二个语句中再次计算 img.max()。当我使用minMaxLoc() 同时计算minmax 时,我将它与我之前所做的比较。【参考方案2】:

我遇到了类似的问题,当我尝试将图像 64F 转换为 CV_U8 时,我最终会出现黑屏。

这个link 将帮助您了解数据类型和转换。以下是对我有用的代码。

from skimage import img_as_ubyte
cv_image = img_as_ubyte(any_skimage_image)

【讨论】:

【参考方案3】:

您可以将其转换为 Numpy 数组。

import numpy as np

# Convert source image to unsigned 8 bit integer Numpy array
arr = np.uint8(image)

# Width and height
h, w = arr.shape

OpenCV Python API 似乎也接受 Numpy 数组。我还没有测试过。请测试它并告诉我结果。

【讨论】:

我将 OpenCV 3.2 与 Python 3.6.2 一起使用,运行代码时出现此错误:AttributeError: module 'cv2' has no attribute 'fromarray'。 @Jazz 从 OpenCV 3.2 开始,似乎不需要 fromarray。 ***.com/questions/43923669/… 在 Python 中,OpenCV Mat 对象基本上是一个 numpy 数组。它们可以互换。 这不起作用:在应用np.uint8(img) 并将结果应用到cv2.equalizeHist 之后,仍然会出现与OP 中相同的错误

以上是关于将图像从 CV_64F 转换为 CV_8U的主要内容,如果未能解决你的问题,请参考以下文章

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

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

OpenCV 转换慢

OpenCV中的图像数据格式CV_8U定义

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

OPEN CV系列二:图像处理