OpenCV 中的等效 im2double 函数 Python
Equivalent im2double function in OpenCV Python
在 MATLAB 中,以下代码读取图像并对 [0.0,1.0]
之间的值进行归一化:
img=im2double(imread('image.jpg'))
我想在 OpenCV 中执行此操作 Python。是否有等效的函数来执行此操作?
我试过下面的代码,但它要求源代码 IplImage
。另外,Python 中的 imread
相当于什么?
def im2double(im):
mat = cvGetMat(im);
if CV_MAT_DEPTH(mat.type)==CV_64F:
return mat
im64f = array(size(im), 'double')
cvConvertScale(im, im64f, 1.0, 0.0)
return im64f
我会避免使用旧的 cv
模块,而是使用 cv2
,因为它们使用 numpy
数组。 numpy
数组的操作与 MATLAB 中的数组和矩阵非常相似。
在任何情况下,MATLAB 中的 im2double
都会对图像进行归一化,使最小强度为 0,最大强度为 1。给定一个像素 in
,您可以通过以下关系实现这一点从图像 img
:
out = (in - min(img)) / (max(img) - min(img))
因此,您需要找到图像的最小值和最大值,并将上述操作应用于图像中的每个像素。在多通道图像的情况下,我们会找到所有通道的 global 最小值和最大值,并对所有通道独立应用相同的操作。
您问题的简短回答是像这样使用 cv2.normalize
:
out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)
第一个输入是源图像,我们将其转换为 float
。第二个输入是输出图像,但我们将其设置为 None
,因为我们希望函数调用对我们来说是 return。第三个和第四个参数指定了你想要在输出中出现的最小值和最大值,分别为0和1,最后一个输出指定了你想要如何规范化图像。我描述的内容属于 NORM_MINMAX
标志。
你的另一个问题是关于读入图像的。要使用 cv2
读入图像,请使用 cv2.imread
。该函数的输入是一个字符串,其中包含您要加载的文件。因此,您可以像这样调用上面的函数:
img = cv2.imread('....') # Read image here
out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX) # Convert to normalized floating point
但是,如果您想自己编写一些东西,我们可以使用 numpy
操作轻松实现。
因此,像这样编写你的函数:
import cv2
import numpy as np
def im2double(im):
min_val = np.min(im.ravel())
max_val = np.max(im.ravel())
out = (im.astype('float') - min_val) / (max_val - min_val)
return out
然后您可以像这样使用代码:
img = cv2.imread('...') # Read in your image
out = im2double(img) # Convert to normalized floating point
编辑 - 2016 年 9 月 29 日
更新版本的 MATLAB 现在只需将所有数字除以该数据类型支持的最大值。例如,uint8
的最大值为 255,而 uint16
的最大值为 65535。
如果您想为更新版本的 MATLAB 重新实现它,您可以使用 numpy.iinfo
函数来推断数据类型的最小值和最大值,并进行相应的转换。只需访问最大值并将图像中的所有元素除以该数字即可。确保先将图像转换为浮点表示:
import cv2
import numpy as np
def im2double(im):
info = np.iinfo(im.dtype) # Get the data type of the input image
return im.astype(np.float) / info.max # Divide all values by the largest possible value in the datatype
在 MATLAB 中,以下代码读取图像并对 [0.0,1.0]
之间的值进行归一化:
img=im2double(imread('image.jpg'))
我想在 OpenCV 中执行此操作 Python。是否有等效的函数来执行此操作?
我试过下面的代码,但它要求源代码 IplImage
。另外,Python 中的 imread
相当于什么?
def im2double(im):
mat = cvGetMat(im);
if CV_MAT_DEPTH(mat.type)==CV_64F:
return mat
im64f = array(size(im), 'double')
cvConvertScale(im, im64f, 1.0, 0.0)
return im64f
我会避免使用旧的 cv
模块,而是使用 cv2
,因为它们使用 numpy
数组。 numpy
数组的操作与 MATLAB 中的数组和矩阵非常相似。
在任何情况下,MATLAB 中的 im2double
都会对图像进行归一化,使最小强度为 0,最大强度为 1。给定一个像素 in
,您可以通过以下关系实现这一点从图像 img
:
out = (in - min(img)) / (max(img) - min(img))
因此,您需要找到图像的最小值和最大值,并将上述操作应用于图像中的每个像素。在多通道图像的情况下,我们会找到所有通道的 global 最小值和最大值,并对所有通道独立应用相同的操作。
您问题的简短回答是像这样使用 cv2.normalize
:
out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)
第一个输入是源图像,我们将其转换为 float
。第二个输入是输出图像,但我们将其设置为 None
,因为我们希望函数调用对我们来说是 return。第三个和第四个参数指定了你想要在输出中出现的最小值和最大值,分别为0和1,最后一个输出指定了你想要如何规范化图像。我描述的内容属于 NORM_MINMAX
标志。
你的另一个问题是关于读入图像的。要使用 cv2
读入图像,请使用 cv2.imread
。该函数的输入是一个字符串,其中包含您要加载的文件。因此,您可以像这样调用上面的函数:
img = cv2.imread('....') # Read image here
out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX) # Convert to normalized floating point
但是,如果您想自己编写一些东西,我们可以使用 numpy
操作轻松实现。
因此,像这样编写你的函数:
import cv2
import numpy as np
def im2double(im):
min_val = np.min(im.ravel())
max_val = np.max(im.ravel())
out = (im.astype('float') - min_val) / (max_val - min_val)
return out
然后您可以像这样使用代码:
img = cv2.imread('...') # Read in your image
out = im2double(img) # Convert to normalized floating point
编辑 - 2016 年 9 月 29 日
更新版本的 MATLAB 现在只需将所有数字除以该数据类型支持的最大值。例如,uint8
的最大值为 255,而 uint16
的最大值为 65535。
如果您想为更新版本的 MATLAB 重新实现它,您可以使用 numpy.iinfo
函数来推断数据类型的最小值和最大值,并进行相应的转换。只需访问最大值并将图像中的所有元素除以该数字即可。确保先将图像转换为浮点表示:
import cv2
import numpy as np
def im2double(im):
info = np.iinfo(im.dtype) # Get the data type of the input image
return im.astype(np.float) / info.max # Divide all values by the largest possible value in the datatype