2017-02-12 9 views
3

파이썬에서 1과 0의 목록으로 이미지를 만들려고합니다.목록에서 이미지 만들기

from PIL import Image 

img1 = Image.open('Image1.gif') #the image is strictly black and white 
img1_size = img1.size 
img1_k = [] 
for i in range(img1_size[0]): 
    for j in range(img1_size[1]): 
     tmp_pix = img1.getpixel((i,j)) 
     if (tmp_pix>127): 
      img1_k.append(1) 
     else: 
      img1_k.append(0) 


img = Image.new('RGB', (img1_size[1],img1_size[0]), "white") 
cmap = {1: (255,255,255), 
     0: (0,0,0)} 
data = [cmap[i] for i in img1_k] 
img.putdata(data) 
img.show()    
img.save('Image2.png') 

그러나, 대신 원래 이미지 :

enter image description here

코드가 생성하는 회전 및 반전 이미지 :

enter image description here

나는 추측하고있어 그 putdata의 형식 () 내가 목록에 대한 픽셀을 얻은 방식과 다릅니다. 어떻게 사진을 제대로 볼 수 있습니까?

답변

2

getpixel, putpixel은 x-y 좌표를 기반으로하고 getdata, putdata은 행 기반을 기반으로합니다.

첫째, 당신은 기반 img_k 행 열 수 있도록해야합니다, 대신 BTW

img = Image.new('RGB', (img1_size[0], img1_size[1]), "white") # <-- 
# OR Image.new('RGB', img1.size, "white") 
cmap = {1: (255,255,255), 
     0: (0,0,0)} 
data = [cmap[i] for i in img1_k] 
img.putdata(data) 
img.show()    
img.save('Image2.png') 

:

for j in range(img1_size[1]):  # row (y) 
    for i in range(img1_size[0]): # column (x) 
     tmp_pix = img1.getpixel((i,j)) 
     if tmp_pix > 127: 
      img1_k.append(1) 
     else: 
      img1_k.append(0) 

둘째, 당신은 X * Y 크기의 이미지를 만들 필요가 getpixelputdata을 혼합하면 getdataputdata을 사용하면 코드가 더 간단해질 수 있습니다.

from PIL import Image 

img1 = Image.open('Image1.gif') 
data = [(255, 255, 255) if pixel > 127 else (0, 0, 0) for pixel in img1.getdata()] 
img = Image.new('RGB', img1.size, "white") 
img.putdata(data) 
img.show()    
img.save('Image2.png') 
+0

고맙습니다. 그것은 작동합니다. –

+0

@CaiphasKain, 오신 것을 환영합니다. 해피 파이썬 프로그래밍. – falsetru