2009-04-25 3 views
1

을 사용하여 파이썬에 Image Magick 명령 (Fx Special Effects Image Operator 사용)에서 일부 이미지 처리 기능을 이식하려고합니다. 내 문제는 내가이 FX 연산자가 무엇을하고 있는지 전혀 이해하지 않다이다 : 높은 수준에서ImageMagick FX 연산자를 PIL로 순수한 파이썬 코드로 변환

convert input.png gradient.png -fx "v.p{0,u*v.h}" output.png 

,이 명령은 그라데이션 이미지 (gradient.png)에서 색상을 소요하고 색상 팔레트로 적용 입력 이미지 (input.png)의 출력 이미지 (output.png)에 대한 쓰기 내가 알아 낸 것 것과

, U는 입력 이미지가 V는 구배이며, 그것은 어떻게 든 , 위에서 아래로 그라데이션의 각 가장 왼쪽 픽셀을 통과 입니다 입력 이미지에 색상을 적용합니다.

PIL로이 동일한 작업을 프로그래밍 방식으로 수행하는 방법에 대해 머리를 감쌀 수 없습니다. 가장 좋은 점은 이미지를 팔레트 화 된 이미지 (약 256 색으로 다운 샘플링)로 변환하고 픽셀 액세스 개체가있는 그라디언트에서 개별적으로 색을 잡는 것입니다.

import Image 

# open the input image 
input_img = Image.open('input.png') 

# open gradient image and resize to 256px height 
gradient_img = Image.open('gradient.png') 
gradient_img = gradient_img.resize((gradient_img.size[0], 256,)) 

# get pixel access object (significantly quicker than getpixel method) 
gradient_pix = gradient_img.load() 

# build a sequence of 256 palette values (going from bottom to top) 
sequence = [] 
for i in range(255, 0, -1): 
    # from rgb tuples for each pixel row 
    sequence.extend(gradient_pix[0, i]) 

# convert to "P" mode in order to use putpalette() with built sequence 
output_img = input_img.convert("P") 
output_img.putpalette(sequence) 

# save output file 
output_img = output_img.convert("RGBA") 
output_img.save('output.png') 

이것은 작동하지만, 말했듯이, 256 색으로 다운 샘플링됩니다. 은 이런 일을하는 손으로 만든 방법 일뿐 아니라 실제로는 진절머리 나는 출력이됩니다. image. 결과를 265 색으로 섞지 않고 Magick 기능을 복제 할 수 있습니까?

부록 : 나는 그것이 약 한달이었다 알고 blog where I found the original Magick command

답변

1

를 인용하는 것을 잊었다 당신은 이미 파악하고있다 있습니다. 그러나 여기에 답이 있습니다.

ImageMagicK 문서에서 나는 효과가 실제로 무엇을하는지 이해할 수있었습니다.

convert input.png gradient.png -fx "v.p{0,u*v.h}" output.png 

v is the second image (gradient.png) 
u is the first image (input.png) 
v.p will get a pixel value 
v.p{0, 0} -> first pixel in the image 
v.h -> the hight of the second image 
v.p{0, u * v.h} -> will read the Nth pixel where N = u * v.h 

내가 PIL로 그 변환, 그 결과는 당신이 원하는 정확히 다음과 같습니다

import Image 

# open the input image 
input_img = Image.open('input.png') 

# open gradient image and resize to 256px height 
gradient_img = Image.open('gradient.png') 
gradient_img = gradient_img.resize((gradient_img.size[0], 256,)) 

# get pixel access object (significantly quicker than getpixel method) 
gradient_pix = gradient_img.load() 

data = input_img.getdata() 
input_img.putdata([gradient_pix[0, r] for (r, g, b, a) in data]) 
input_img.save('output.png') 
+0

덕분에, 그 beatifully 작품! 나는 비슷한 알고리즘을 (머리와 키보드가 많이 부딪 치고, imagemagick 사람들로부터 많은 도움을 받았다) 알아 냈다. 그러나 나는 너의 것이 실제로 어쨌든 나의 것보다 더 효율적이라고 생각한다. – EvanK