복붙노트

[PYTHON] Python : PIL은 단일 RGBA 색상을 대체합니다.

PYTHON

Python : PIL은 단일 RGBA 색상을 대체합니다.

나는 이미이 질문을 살펴 봤다 : 그래서 질문과 알파 값을 포함하여 단일 색상을 대체하기위한 매우 유사한 기술을 구현하는 것 :

c = Image.open(f)
c = c.convert("RGBA")
w, h = c.size
cnt = 0
for px in c.getdata():
    c.putpixel((int(cnt % w), int(cnt / w)), (255, 0, 0, px[3]))                                                                                                      cnt += 1

그러나 이것은 매우 느립니다. 나는 interwebs에이 조리법을 밖으로 가지고 갔다, 그러나 그것을 지금까지는 성공을 사용하지 않았다 : 조리법

내가 뭘 하려는지는 하나의 색상, 흰색으로 구성된 다양한 PNG 이미지를 가져가는 것입니다. 각 픽셀은 100 % 흰색이며 알파 = 0을 비롯한 다양한 알파 값이 있습니다. 기본적으로 # ff0000 <00-ff>와 같이 이미지를 새로운 색상으로 색칠합니다. 그래서 내 시작과 결과 이미지는 왼쪽이 내 시작 이미지이고 오른쪽이 내 결말 이미지입니다 (참고 : 배경이 연한 회색으로 변경되어 실제로 투명 해지기 때문에 배경을 볼 수 있습니다. 왼쪽의 점들을 볼 수 있어야합니다.)

이 작업을 수행하는 더 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.numpy를 사용하면 PIL 이미지를 훨씬 빠르고 빠르게 조작 할 수 있습니다.

    numpy를 사용하면 PIL 이미지를 훨씬 빠르고 빠르게 조작 할 수 있습니다.

    예 :

    import Image
    import numpy as np
    
    im = Image.open('test.png')
    im = im.convert('RGBA')
    
    data = np.array(im)   # "data" is a height x width x 4 numpy array
    red, green, blue, alpha = data.T # Temporarily unpack the bands for readability
    
    # Replace white with red... (leaves alpha values alone...)
    white_areas = (red == 255) & (blue == 255) & (green == 255)
    data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed
    
    im2 = Image.fromarray(data)
    im2.show()
    

    편집 : 그것은 천천히 월요일, 그래서 나는 몇 가지 예제를 추가 줄 알았는데 :

    알파 값 만 남겨두고 있음을 보여주기 위해 알파 채널에 방사형 그래디언트가 적용된 예제 이미지 버전의 결과는 다음과 같습니다.

    기발한:

    결과:

  2. ==============================

    2.이것을 시험해보십시오.이 샘플에서는 색상이 흰색이 아닌 경우 색상을 검정으로 설정합니다.

    이것을 시험해보십시오.이 샘플에서는 색상이 흰색이 아닌 경우 색상을 검정으로 설정합니다.

    #!/usr/bin/python
    from PIL import Image
    import sys
    
    img = Image.open(sys.argv[1])
    img = img.convert("RGBA")
    
    pixdata = img.load()
    
    # Clean the background noise, if color != white, then set to black.
    
    for y in xrange(img.size[1]):
        for x in xrange(img.size[0]):
            if pixdata[x, y] == (255, 255, 255, 255):
                pixdata[x, y] = (0, 0, 0, 255)
    

    김프에서 색상 선택 도구를 사용하여 색상을 흡수하고 rgba 색상을 볼 수 있습니다.

  3. ==============================

    3.이미지 모듈에 대한 Pythonware PIL 온라인 서적 장에서는 putpixel ()이 느리고 인라인으로 속도를 높일 수 있다고 제안합니다. 또는 PIL 버전에 따라 load ()를 대신 사용하십시오.

    이미지 모듈에 대한 Pythonware PIL 온라인 서적 장에서는 putpixel ()이 느리고 인라인으로 속도를 높일 수 있다고 제안합니다. 또는 PIL 버전에 따라 load ()를 대신 사용하십시오.

  4. from https://stackoverflow.com/questions/3752476/python-pil-replace-a-single-rgba-color by cc-by-sa and MIT license