将图像从 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()
同时计算min
和max
时,我将它与我之前所做的比较。【参考方案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类型?