【问题标题】:implement mat2gray in Opencv with Python用 Python 在 Opencv 中实现 mat2gray
【发布时间】:2016-10-01 15:47:51
【问题描述】:

我和他有同样的问题: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。请帮忙,谢谢。

【问题讨论】:

    标签: python matlab opencv


    【解决方案1】:

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

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

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

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

    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)
    

    【讨论】:

    • 这是不正确的。您需要除以 255,而不是标准化。归一化在这种情况下起作用的事实只是运气,因为原始图像具有 0 和 255 值。
    • @Miki 他想在 MATLAB 中模拟mat2gray 的行为。 mat2gray 不会除以 255,而是缩放输入中的所有值,以便它们跨越 0 到 1,而不管输入的最大值如何。
    • 我想缩放图像不是从 0 到 1,而是从 0 到 255
    • @semicolon 您只需将 1.0 更改为 255.0 或传递一个 8 位无符号整数的输入
    【解决方案2】:

    引用自 @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
    

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2017-08-14
      • 2013-02-24
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多