Python 带有opencv的matlplotlib提供具有相同像素值的不同图像

Python 带有opencv的matlplotlib提供具有相同像素值的不同图像,python,opencv,matplotlib,Python,Opencv,Matplotlib,我一直在尝试稍微修改图像的像素,但是颜色变了。因此,我将每个像素乘以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

我一直在尝试稍微修改图像的像素,但是颜色变了。因此,我将每个像素乘以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()

像素保持不变,但在某种程度上我看到的图像是不同的。

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

  • 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)