使用python PIL从白天到晚上传递图像

时间:2014-10-23 23:30:11

标签: python numpy python-imaging-library

我在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()

首先,我必须逐个像素地传递图像以进行工作,然后从白天传递到晚上

这是我的结果:

原文:http://imgur.com/0AYqCik

晚上:http://imgur.com/8TnGlCD

1 个答案:

答案 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

night view