[파이썬] Pillow 이미지의 직선 및 원 탐지하기

Pillow은 파이썬에서 이미지 처리 및 조작을 위한 강력한 라이브러리입니다. 이번 포스트에서는 Pillow를 사용하여 이미지에서 직선과 원을 탐지하는 방법에 대해 알아보겠습니다.

준비물

이번 예제를 실행하기 위해서는 다음의 준비물이 필요합니다:

이미지 준비

우선, 직선과 원을 탐지할 이미지를 선택해야 합니다. 본 예제에서는 “input.jpg”라는 파일을 사용하겠습니다. 해당 이미지 파일을 현재 작업 디렉토리에 복사해주세요.

직선 탐지

다음은 Pillow를 사용하여 이미지에서 직선을 탐지하는 예제 코드입니다:

from PIL import Image, ImageDraw
import numpy as np

# 이미지 열기
image = Image.open("input.jpg")

# 이미지를 그레이스케일로 변환
grayscale_image = image.convert("L")

# 이미지를 배열로 변환
image_array = np.array(grayscale_image)

# 이미지 배열을 사용하여 직선 탐지
edges = cv2.Canny(image_array, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

# 직선 그리기
draw = ImageDraw.Draw(image)
for rho, theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    draw.line((x1, y1, x2, y2), fill=(255, 0, 0), width=2)

# 결과 이미지 저장
image.save("output_lines.jpg")

위 코드는 이미지를 그레이스케일로 변환한 뒤, Canny 알고리즘을 사용하여 이미지 전처리 후 Hough 변환을 수행하여 직선을 찾습니다. 찾은 직선은 draw.line 메서드를 사용하여 이미지에 그려줍니다. 결과 이미지는 “output_lines.jpg”로 저장됩니다.

원 탐지

이제 Pillow를 사용하여 이미지에서 원을 탐지하는 예제 코드입니다:

from PIL import Image, ImageDraw
import numpy as np

# 이미지 열기
image = Image.open("input.jpg")

# 이미지를 그레이스케일로 변환
grayscale_image = image.convert("L")

# 이미지 배열로 변환
image_array = np.array(grayscale_image)

# 이미지 배열을 사용하여 원 탐지
circles = cv2.HoughCircles(image_array, cv2.HOUGH_GRADIENT, dp=1, minDist=20,
                           param1=50, param2=30, minRadius=0, maxRadius=0)

# 원 그리기
draw = ImageDraw.Draw(image)
if circles is not None:
    for circle in circles[0]:
        x = circle[0]
        y = circle[1]
        r = circle[2]
        draw.ellipse((x-r, y-r, x+r, y+r), outline=(0, 255, 0), width=2)

# 결과 이미지 저장
image.save("output_circles.jpg")

위 코드에서는 이미지를 그레이스케일로 변환한 뒤, HoughCircles 함수를 사용하여 원을 탐지합니다. 찾은 원은 draw.ellipse 메서드를 사용하여 이미지에 그려줍니다. 결과 이미지는 “output_circles.jpg”로 저장됩니다.

마치며

이번 포스트에서는 Pillow를 사용하여 이미지에서 직선과 원을 탐지하는 방법에 대해 알아보았습니다. Pillow는 강력한 이미지 처리 도구로 다양한 애플리케이션에 유용하게 사용될 수 있습니다. 추가적인 기능과 효과를 적용하여 이미지 처리를 더욱 향상시킬 수도 있습니다.

향후 포스트에서는 Pillow의 다른 기능과 활용 방법에 대해 알아보겠습니다. 기대해주세요!