편집 : Mark and zephyr 덕분에 코드가 작동 중입니다. 제퍼는 아래에 두 가지 대체 해결책이 있습니다.파이썬 PIL - 두 이미지를 블렌드하는 기능?
두 이미지를 PIL로 블렌드하고 싶습니다. ImageChops.multiply(image1, image2)
을 찾았지만 비슷한 divide(image, image2)
기능을 찾을 수 없습니다.
Divide Blend Mode Explained (나는 내 테스트 소스로 여기 처음 두 이미지를 사용했습니다.)
이 거기에 내장 나누기 혼합 기능 내가 (그렇지 않으면 PIL 이상)를 놓친?
아래의 테스트 코드가 실행되고 찾고있는 항목에 가까워지고 있습니다. 결과 이미지 출력은 여기에서 나누기 블렌드 예제 이미지 (Divide Blend Mode Explained)와 유사합니다.
블렌드 작업을보다 효율적으로 나눌 수 있습니까? 처음에 나는 Image.eval
과 ImageMath.eval
에있는 람다 함수를 사용하여 검정 픽셀을 확인하고 나눗셈 과정에서 흰색으로 뒤집어 보았습니다.하지만 올바른 결과를 얻지 못했습니다.
수정 : 수정 코드 및 마크 및 제퍼 덕분에 단축되었습니다. 결과 이미지 출력은 아래의 제피어의 numpy 및 scipy 솔루션의 출력과 일치합니다. 여기 http://www.linuxtopia.org/online_books/graphics_tools/gimp_advanced_guide/gimp_guide_node55_002.html
scipy /하기 matplotlib로 구현 것 :
# PIL Divide Blend test
import Image, os, ImageMath
imgA = Image.open('01background.jpg')
imgA.load()
imgB = Image.open('02testgray.jpg')
imgB.load()
# split RGB images into 3 channels
rA, gA, bA = imgA.split()
rB, gB, bB = imgB.split()
# divide each channel (image1/image2)
rTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=rA, b=rB).convert('L')
gTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=gA, b=gB).convert('L')
bTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=bA, b=bB).convert('L')
# merge channels into RGB image
imgOut = Image.merge("RGB", (rTmp, gTmp, bTmp))
imgOut.save('PILdiv0.png', 'PNG')
os.system('start PILdiv0.png')
해결책 주셔서 감사합니다. 그것은 훨씬 더 간단합니다. 나는 pylab과 matplotlib를 살펴볼 것입니다. PIL에는 그다지 간단한 것이 없다고 생각하십니까? 이 링크는 다른 블렌드 모드를 이해하는 데에도 매우 유용합니다. – moski
죄송합니다. PIL에 익숙하지 않습니다.나는 파일을로드/저장하는 데만 사용했습니다. 아마 그것을 할 수있는 방법이 있다고 생각하지만, 나는 numpy로 수학을하는 것이 더 쉽다고 생각합니다. – so12311
다시 한번 감사드립니다. 나는 이미 멍청하고 scipy있다, 그래서 너의 numpy 방법을 시도 할게. (오, 나는 matplotlib도 가지고 있음을 압니다.) 이전 필자의 PIL 함수로 다시 변환하려고했는데 아직 제대로 작동하지 않았습니다. 그동안 업데이트 한 것을 보니 변경 사항을 다시 시도해 보겠습니다. – moski