我在python中从白天到晚上传递图像有些复杂化。
这是我的代码:
enter code here
import numpy as np
from PIL import Image
# convierte una imagen tipo Imagen (de la libreria PIL) en una matriz(ETD) con la informacion RGB de la imagen
def convertirImgMatrixRGB(img):
return np.array(img.convert("RGB"))
# convierte una imagen tipo Imagen (de la libreria PIL) a imagen en Negativo
# procedimiento : multiplica por base 255 cada casilla de la matriz RGB para convertir la imagen en negativo
def PasarDiaNoche(img):
arrImg = convertirImgMatrixRGB(img)
for i in range(img.size[1]):
for j in range(img.size[0]):
arrImg[i][j][0] = arrImg[i][j][0] * 0.1 #rojo
arrImg[i][j][1] = arrImg[i][j][2] * 0.2 #verde
arrImg[i][j][2] = arrImg[i][j][2] *1.7 #azul
imgSepia = Image.fromarray(arrImg)
return imgSepia
def main():
img=Image.open("paisaje2.jpg")
arrImg = convertirImgMatrixRGB(img)
#r, g, b = img.getpixel((100, 100))
#print r,g,b
imgNegativa=PasarDiaNoche(img)
imgNegativa.save("paisajeNoche.jpg") #guarda la imagen negativo
main()
首先,我必须逐个像素地传递图像以进行工作,然后从白天传递到晚上
这是我的结果:
答案 0 :(得分:2)
这一行
arrImg[i][j][2] = arrImg[i][j][2] *1.7 #azul
导致问题,因为arrImg
的数据类型可能是无符号8位,并且此乘法会导致值溢出。例如,在下文中,a
是一个8位无符号整数的numpy数组,只有一个值:
In [6]: a
Out[6]: array([240], dtype=uint8)
如果我们尝试将其乘以1.7并将结果存回a
...
In [7]: a[0] = a[0] * 1.7
我们得到错误的值(注意408模256为152):
In [8]: a
Out[8]: array([152], dtype=uint8)
您可以通过使用浮点值进行计算来解决此问题,然后在必要时将其转换回8位。
你也可以摆脱那些循环。您可以使用numpy的“广播”功能,使用单行完成计算。也可以编写此行,以便将整数值转换为浮点。这是一个例子。
我将图片保存为'view.jpg',然后我会使用scipy.misc.imread
将其读入名为img
的numpy数组中:
In [46]: from scipy.misc import imread
In [47]: img = imread('view.jpg')
查看img
的一些属性:
In [48]: img.shape
Out[48]: (488, 650, 3)
In [49]: img.dtype
Out[49]: dtype('uint8')
此单行创建一个新数组,其中红色,绿色和蓝色通道分别乘以0.1,0.2和1.7。 (这是numpy的“广播”能力的一个例子。)因为第二个被乘数是一个浮点数组,所以结果也是一个浮点数组。
In [50]: arr = img * np.array([0.1, 0.2, 1.7])
以下是arr
的形状和数据类型:
In [51]: arr.shape
Out[51]: (488, 650, 3)
In [52]: arr.dtype
Out[52]: dtype('float64')
In [53]: arr.max()
Out[53]: 433.5
以下重新调整arr
以使最大值为255.0,然后将其强制转换为8位无符号整数数组。
In [54]: img2 = (255*arr/arr.max()).astype(np.uint8)
In [55]: img2.dtype
Out[55]: dtype('uint8')
In [56]: img2.max()
Out[56]: 255
以下是img2
: