2017-02-04 5 views
4

콘트라스트를 변경해야하는 프로그램이 있지만, 콘트라스트를 실제로 변경하지 않는 것 같은 느낌이 듭니다. 일부 영역은 빨간색으로 변경되지만 원하지는 않습니다. 그들을 제거하는 법을 제게 말할 수 있다면, 고마워요. 여기 코드입니다 : 여기PIL에서 이미지의 대비를 변경하십시오.

from PIL import Image 


def change_contrast(img, level): 

    img = Image.open("C:\\Users\\omar\\Desktop\\Site\\Images\\obama.png") 
    img.load() 

    factor = (259 * (level+255))/(255 * (259-level)) 
    for x in range(img.size[0]): 
     for y in range(img.size[1]): 
      color = img.getpixel((x, y)) 
      new_color = tuple(int(factor * (c-128) + 128) for c in color) 
      img.putpixel((x, y), new_color) 

    return img 

result = change_contrast('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1.jpg', 100) 
result.save('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1_output.jpg') 
print('done') 

그리고 이미지와 그 결과이 실제 대비 방법을 경우

obama.png obama modified

이 나에게

+0

재현 할 수 없습니다. 귀하의 코드를 시도하고 출력 이미지가 좋아 보인다. https://i.stack.imgur.com/QhR3n.jpg –

+0

코드에는 입력 이미지를로드 할 때 두 가지 시도가 있습니다. 함수 바디에'obama.png'가 하드 코딩되어 있기 때문에'test_image1.jpg'는 사용되지 않습니다. 사용하고 있다고 생각하는 입력 파일을 사용하고 있습니까? –

답변

8

버그를 재현하지 못했습니다. 제 플랫폼 (데비안)에서는 Pillow 포크 만 사용할 수 있습니다. 따라서 오래된 PIL 패키지를 사용하는 경우 이것이 원인 일 수 있습니다.

어쨌든 이런 종류의 작업을 수행하는 방법은 Image.point()입니다. 각 채널의 각 픽셀을 매핑하므로 파이썬에서 세 개의 중첩 루프를 수행하는 것보다 빠릅니다. 단일 채널 (빨간색)의 오버 플로우를 가지고있는 것처럼

def change_contrast(img, level): 
    factor = (259 * (level + 255))/(255 * (259 - level)) 
    def contrast(c): 
     return 128 + factor * (c - 128) 
    return img.point(contrast) 

change_contrast(Image.open('barry.png'), 100) 

output

귀하의 출력을 보인다. 왜 그런 일이 일어날 지 아무 이유 없어. 그러나 level이 259보다 높으면 출력이 반전됩니다. 아마도 초기 버그의 원인 일 것입니다.

def change_contrast_multi(img, steps): 
    width, height = img.size 
    canvas = Image.new('RGB', (width * len(steps), height)) 
    for n, level in enumerate(steps): 
     img_filtered = change_contrast(img, level) 
     canvas.paste(img_filtered, (width * n, 0)) 
    return canvas 

change_contrast_multi(Image.open('barry.png'), [-100, 0, 100, 200, 300]) 

another output

가능한 수정 버그가 든 넘쳐 음수가 발생할 수 있는지 보이기 때문에 콘트라스트 필터 만 내지 [255]에서 값을 반환하는 것이다.

def change_contrast(img, level): 
    factor = (259 * (level + 255))/(255 * (259 - level)) 
    def contrast(c): 
     value = 128 + factor * (c - 128) 
     return max(0, min(255, value)) 
    return img.point(contrast) 
+0

좋아, 그건 내가 찾고 있었는지 스케일 dépendant 대비 수정자를 만들고 싶어. 나는 그것을 밖으로 시도하고 그것이 작동하는지 확인합니다.만약 그렇다면 대답으로 받아 들일 것입니다. –

+0

평범한 Numpy로 만들 때 Numpy 배열로 표현 된 이미지에서 사용할 때 왜 같은 기능이 작동하지 않습니까? – Alex

+0

그건 내 대답에 설명되어있어. point는 Image 클래스의 메서드입니다. –

4

을 알려 주시기 바랍니다 이미 PIL 모듈에 contrast이라는 클래스가 만들어졌습니다. 당신은 단순히 그것을 사용할 수 있습니다.

from PIL import Image, ImageEnhance 
image = Image.open(':\\Users\\omar\\Desktop\\Site\\Images\\obama.png') 
scale_value=scale1.get() 
contrast = ImageEnhance.Contrast(image) 
contrast_applied=contrast.enhance(scale_value) 
image.show() 
+0

네, 그러나 대비의 정도를 조정할 수는 없습니다. 나는 사진에 적용된 대비의 수준을 정의하는 척도를 원한다.이 명령은 조율 될 수 없거나 어떻게 해야할지 모른다. 내가 작업하고있는 다른 프로그램이 필요하다면 내가 말하는 내용을 적용 해 내가 그 내용을 게시물에 올릴 것이라고 말합니다. –

+0

명암 대비를 향상시키고 싶습니까? o – orvi

+0

예, 사용자가 선택한 수준에 따라 사진의 원래 사진과 대조됩니다. 다른 프로그램을 게시해야합니까? –