我将避免使用旧的cv模块,而是使用cv2,因为它们使用numpy数组。numpy数组的操作与MATLAB中的数组和矩阵非常相似。
在任何情况下,^{}在MATLAB中对图像进行规格化,使最小强度为0,最大强度为1。如果给定图像的像素img,则可以通过以下关系实现:out = (in - min(img)) / (max(img) - min(img))
因此,您需要找到图像的最小值和最大值,并将上述操作应用于图像中的每个像素。在多通道图像的情况下,我们会找到所有通道上的全局最小值和最大值,并将相同的操作独立应用于所有通道。
对您的问题的简短回答是使用^{}如下:out = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)
第一个输入是源图像,我们将其转换为float。第二个输入是输出图像,但我们将其设置为None,因为我们希望函数调用返回该值。第三个和第四个参数指定要在输出中显示的最小值和最大值,分别为0和1,最后一个输出指定要如何规范化图像。我所描述的属于NORM_MINMAX标志。
你的另一个问题是关于阅读图像。要用cv2读入图像,请使用^{}。此函数的输入是一个包含要加载的文件的字符串。因此,您可以这样调用上面的函数: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中重新实现它,可以使用^{}函数来推断数据类型的最小值和最大值,并相应地进行转换。只需访问最大的值并将图像中的所有元素除以此数字即可。请确保首先将图像转换为浮点表示: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