2012-06-11 3 views
3

먼저이 게시물을 읽었습니다. How to detect an image border programmatically? 그는 X/Y 좌표를 찾는 데 약간 다른 질문을하고있는 것 같습니다.이미지에 경계가 프로그래밍 방식으로 있는지 확인하십시오. (부울 반환)

나는 주어진 사진 주위에 단색이 국경인지 여부를 찾기 위해 노력하고 있습니다. ImageMagick을 사용해 보았습니다. 그러나 이것이 최선의 선택입니까? 이미지 관련 프로그래밍을 한 번도 해 본 적이 없으므로이 문제를 해결할 수있는 간단한 API 만 있으면 좋겠다. 나는 또한이 라이브러리를 사용하는 방법에 상당히 익숙하다. 그래서 어떤 충고도 인정된다. 파이썬이나 자바로 솔루션을 선호합니다.

감사합니다.

+0

국경은 어떻게 달라야합니까? 1 색조 값이 다르거 나 델타 이상입니까? –

+0

국경의 너비에 대해 아십니까? –

+0

@PhilH 미안하지만 그 질문에 대답하는 방법을 잘 모르겠다 - 나는이 기능이 사람이 감지 할 수있는 경계를 탐지해야한다고 말하고 싶다. (IE는 주변에 국경이있을 때 인간에게 상당히 분명하다. 그림). 또한 내가 다루고있는 사진은 일반적으로 집, 풍경 등의 그림이 될 것입니다. – Ken

답변

4

나는 관련 질문 here에 응답하여 이미지 주위의 테두리를 제거하고 PIL을 사용합니다. 그것은 다음과 같이 테두리가 있는지에 대한 True 또는 False을 반환 여부, 그래서 당신은 쉽게 코드를 적용 할 수 있습니다 :

from PIL import Image, ImageChops 

def is_there_a_border(im): 
    bg = Image.new(im.mode, im.size, im.getpixel((0,0))) 
    diff = ImageChops.difference(im, bg) 
    diff = ImageChops.add(diff, diff, 2.0, -100) 
    bbox = diff.getbbox() 
    return bbox != (0,0,im.size[0],im.size[1]) 

그러나이 이미지의 한면에 테두리가 경우에도 True를 반환합니다. 그러나 이미지 주변에 국경이 있는지를 알고 싶어하는 것 같습니다. 이렇게하려면 마지막 줄을 다음과 같이 변경하십시오.

return all((bbox[0], bbox[1], (bbox[0] + bbox[2]) <= im.size[0], 
            (bbox[1] + bbox[3]) <= im.size[1])) 

이것은 모든면에 테두리가있는 경우에만 true를 반환합니다.

False:

enter image description here

False:

enter image description here

True:

예 :

enter image description here

+0

도움 주셔서 감사합니다! 그건 그냥 작동합니다. 그러나, 나는 국경이 모든 방향으로 있는지 (즉, '모두 반환'라인인지) 찾는 데있어 솔루션에 문제가 있습니다. 나는 국경을 가진 그림에 그것을 시도하고 매번 "틀린"얻었다. 왜이게 될지 아십니까? 답변이 어떻게 작동하는지에 대해 자세히 설명해 주시겠습니까?나는 그것이 많은 것을 요구하고 있다는 것을 압니다 - 나는 그것을 고맙게 여길 것입니다. 감사! – Ken

+1

@Ken - [이 링크] (http://stackoverflow.com/questions/10615901/trim-whitespace-using-pil/10616717#10616717)에서 코드의 주요 섹션이 어떻게 작동하는지 설명합니다. 30 분 전 편집 한 마지막 줄에 실수가 있었으므로 올바른 코드를 사용하고 있는지 확인하십시오. 어쩌면 당신은 작동하지 않는 이미지에 대한 링크를 게시 할 수 있습니다. ;) – fraxel

+0

감사합니다. 나는 올바른 버전의 코드를 가지고 있었다. 이것은 제가 문제가있는 이미지입니다 : http://imgur.com/qvZHX 고마워요! – Ken

1

fraxel의 답변을 본 후, 경계가 얼마나 넓은 지 신경 쓰지 않으면 각면의 가장 바깥 쪽 픽셀을 잘라 내고 색상이 균일한지 확인할 수 있습니다. 매우 빨라야합니다. 배경색을 픽셀의 배경색을 0,0으로 설정하고 1,1을 w-2, h-2로 잘라 냄으로써 나머지 이미지는 정확히 1 색이어야합니다.

관련 문제