【问题标题】:matlplotlib with opencv gives a different image with the same pixel values带有 opencv 的 matplotlib 给出具有相同像素值的不同图像
【发布时间】:2017-01-25 17:06:52
【问题描述】:

我一直在尝试稍微修改图像的像素,但颜色变得扭曲。所以,我将每个像素乘以 1 并看到了结果。

这是我的代码

import numpy as np
from matplotlib import pyplot as plt
import cv2

mud1 = cv2.imread('mud.jpeg')
print mud1.shape

mask = np.random.random_integers(1,1,size=(81,81,3))

print mask.shape
print mask[21][21][2]
print mud1[21][21][2]
mud1new = np.multiply(mud1,mask)
print mud1new[21][21][2]

plt.subplot(121),plt.imshow(mud1),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(mud1new),plt.title('Masked')
plt.xticks([]), plt.yticks([])
plt.savefig('problem.jpeg')
plt.show()

像素保持不变,但不知何故,我看到的图像有所不同。

【问题讨论】:

    标签: python opencv matplotlib


    【解决方案1】:

    问题是因为np.random.random_integers 返回的对象是int64,而您加载的图像是uint8,所以当您将两者相乘时,mud1new 变成了int64 数组。当使用imshow 时,它需要以下类型

    • MxN – 要映射的值(浮点数或整数)
    • MxNx3 – RGB(浮点型或 uint8)
    • MxNx4 – RGBA(浮点型或 uint8)

    要解决此问题,您应该在使用imshow 显示之前将mud1new 转换为uint8

    mud1new = mud1new.astype(np.unit8)
    plt.imshow(mud1new)
    

    您也可以将 mud1new 转换为 float,但这要求您的所有值都应介于 0 和 1 之间,因此您必须将所有值除以 255。

    MxNx3 和 MxNx4 浮点数组的每个分量的值应在 0.0 到 1.0 的范围内。

    mud1new_float = mud1new.astype(np.float) / 255.0;
    plt.imshow(mud1new_float)
    

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      相关资源
      最近更新 更多