使用Python

时间:2016-10-01 15:47:51

标签: python matlab opencv

我和他有同样的问题:Scaling a matrix in OpenCV

我和他有同样的问题,我有彩色图片,我用matlab来读取图片:Input = imread('input1.jpg');,图片的格式是612x612x3 uint8,我在图片中打印5x5x1像素下面:Input(1:5,1:5,1)

 201   201   201   201   201
 201   201   201   201   201
 202   202   202   202   202
 203   203   203   203   203
 204   204   204   204   204

使用mat2gray函数:rgb_out = mat2gray(Input);,这些像素可以转换为此,它们都在0到1之间的范围内:rgb_out(1:5,1:5,1)

0.9684    0.9455    0.9266    0.9099    0.9047
0.9657    0.9542    0.9432    0.9354    0.9299
0.9642    0.9571    0.9502    0.9495    0.9456
0.9621    0.9609    0.9562    0.9532    0.9516
0.9673    0.9633    0.9597    0.9580    0.9575

所以问题是我如何在Opencv中用Python实现它,我尝试了如下代码:

print(Input)
rgb_out = np.zeros(Input.shape, np.uint8)
cv2.normalize(Input,rgb_out,1,0,cv2.NORM_MINMAX)
print(rgb_out)

但第一张照片是:

[[[205 207 201]
  [205 207 201]
  [205 207 201]
  ..., 
  [232 254 242]
  [232 254 242]
  [231 253 241]]...

并且rgb_out中的元素不超过1或0.请帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

您的输入矩阵是整数数据类型,输出矩阵定义为np.uint8(整数类型)。默认情况下,cv2.normalize将返回与输入数据类型相同的结果。如果您希望输出值在0.01.0之间,则您将要使用浮点数据类型。

一种选择是在调用np.double之前将输入和输出转换为cv2.normalize

A = np.double(A)
out = np.zeros(A.shape, np.double)
normalized = cv2.normalize(A, out, 1.0, 0.0, cv2.NORM_MINMAX)

或者,您可以通过cv2.normalize kwarg将浮点数据类型指定为dtype以强制使用特定的输出数据类型。

A = np.array([1, 2, 3])
out = np.zeros(A.shape, np.double)
normalized = cv2.normalize(A, out, 1.0, 0.0, cv2.NORM_MINMAX, dtype=cv2.CV_64F)

答案 1 :(得分:0)

参考@Suever的答案,这里我的工作变量与Matlab的mat2gray相同。

# python function replica of matlab's mat2gray
def matlab_mat2grey(A = false, alpha = min(A.flatten()), beta = max(A.flatten())):
  I = A
  cv2.normalize(A, I, alpha , beta ,cv2.NORM_MINMAX)
  I = np.uint8(I)
  return I