HOWTO · Python

Python에서 OpenCV 모듈을 사용하여 이미지 반전

Python에서 OpenCV 모듈을 사용하여 이미지를 반전하는 방법 알아보기

이 페이지의 내용

Python에서 OpenCV가 반환한 배열에 cv2.bitwise_not()을 적용하면 이미지를 반전할 수 있습니다. 부호 없는 8비트 이미지 채널의 값 v는 255 - v가 됩니다. 아래에서는 채널별 처리 방식과 샘플 픽셀 계산을 설명하고, 컬러 또는 그레이스케일 이미지를 처리해 결과를 저장하는 방법을 보여 줍니다.

사전 준비 및 이미지 불러오기

스크립트를 실행할 환경에 Python과 OpenCV를 설치합니다. 패키지 이름은 opencv-python이고, Python 코드에서는 cv2로 가져옵니다. 아직 설치하지 않았다면 pip install opencv-python으로 설치하세요. NumPy 대안도 NumPy가 필요하며, 일반적인 OpenCV Python 패키지를 설치하면 NumPy도 의존성으로 함께 설치됩니다.

input_path에 읽을 수 있는 이미지 파일의 경로를 지정합니다. OpenCV는 기본적으로 컬러 이미지를 BGR 채널 순서로 불러옵니다. image = cv2.imread(input_path)로 이미지를 읽은 뒤, 처리하기 전에 image is not None인지 확인하세요. 파일이 없거나 읽을 수 없으면 imread는 None을 반환합니다. 아래 예제에서는 일반적인 이미지 파일에 흔히 쓰이는 8비트 채널 값을 사용합니다.

이미지 반전의 원리

반전은 각 채널 값을 그 보수 값으로 바꿉니다. 부호 없는 8비트 값은 0부터 255까지이므로 검정은 흰색으로, 흰색은 검정으로 바뀌고, 예를 들어 40은 215가 됩니다. 이 연산은 각 채널에 독립적으로 적용되므로 컬러 픽셀의 파랑, 초록, 빨강 값이 모두 반전됩니다. OpenCV의 기본 컬러 배열은 RGB가 아니라 BGR 순서입니다. 반전 후에도 채널 순서는 유지되므로 색상 채널을 서로 바꾸지 않습니다.

OpenCV로 이미지 반전하기

OpenCV의 cv2.bitwise_not()은 배열의 각 요소에 비트 NOT 연산을 적용합니다. 부호 없는 8비트 이미지 데이터에서는 각 값을 255에서 뺀 것과 같은 결과가 나옵니다. 아래의 간단한 표준 라이브러리 예제는 이미지 파일이나 이미지 처리 패키지 없이 픽셀 계산을 확인할 수 있게 합니다. 값의 변화를 이해하는 데 활용하세요. OpenCV 이미지 배열을 처리할 때는 이미지가 성공적으로 로드되었는지 확인한 다음 cv2.bitwise_not(image)을 호출하면 됩니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

pixel = [10, 40, 200]
inverted_pixel = [255 - value for value in pixel]
print("original:", pixel)
print("inverted:", inverted_pixel)
original: [10, 40, 200]
inverted: [245, 215, 55]

파일을 처리하려면 input_path와 output_path에 각각 이미지 파일과 저장 위치를 지정한 뒤 이 예제를 실행하세요. 먼저 OpenCV를 설치해야 합니다. 아래 경로는 컴퓨터에 있는 파일 경로로 바꿔야 하는 명시적인 예시입니다. 프로그램은 이미지 로드나 파일 쓰기에 문제가 있으면 알리고, 이미지가 없는 상태에서 처리를 시도하지 않습니다.

try:
    import cv2
except ImportError:
    print("Install opencv-python to run this example.")
else:
    input_path = "input.png"
    output_path = "inverted.png"
    image = cv2.imread(input_path)

    if image is None:
        print(f"Could not read {input_path}")
    else:
        inverted = cv2.bitwise_not(image)
        written = cv2.imwrite(output_path, inverted)
        if not written:
            print(f"Could not write {output_path}")

        show_preview = False
        if show_preview:
            cv2.imshow("Original", image)
            cv2.imshow("Inverted", inverted)
            cv2.waitKey(0)
            cv2.destroyAllWindows()

로드한 컬러 배열과 반전 결과는 각각 image와 inverted에 저장됩니다. OpenCV는 기본적으로 컬러 채널을 BGR 순서로 반환하며, 이 연산은 순서를 바꾸지 않고 각 채널을 반전합니다. 위의 픽셀 계산 예제에서 같은 부호 없는 8비트 연산을 확인할 수 있습니다.

그레이스케일 이미지 반전하기

그레이스케일 이미지는 컬러 채널 세 개 대신 픽셀마다 밝기 값 하나를 가집니다. cv2.IMREAD_GRAYSCALE로 바로 불러오고, gray_image is not None인지 확인한 뒤 같은 비트 연산을 적용하세요. 결과는 2차원의 단일 채널 배열로 유지되며 cv2.imwrite()로 저장할 수 있습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

try:
    import cv2
except ImportError:
    print("Install opencv-python to run this example.")
else:
    input_path = "input.png"
    gray_output_path = "inverted-gray.png"
    gray_image = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE)

    if gray_image is None:
        print(f"Could not read {input_path} as grayscale")
    else:
        inverted_gray = cv2.bitwise_not(gray_image)
        written = cv2.imwrite(gray_output_path, inverted_gray)
        if not written:
            print(f"Could not write {gray_output_path}")

NumPy로 이미지 반전하기

이미지 데이터가 이미 NumPy 배열에 있다면 NumPy의 numpy.invert를 대안으로 사용할 수 있습니다. 이 함수는 각 요소에 비트 NOT 연산을 적용하며, 부호 없는 8비트 값에서는 OpenCV와 같은 채널 보수 값을 만듭니다. 이 예제는 8비트 컬러 이미지를 읽어 NumPy로 반전한 뒤 저장 결과를 확인합니다. 여기서 255 - v라는 해석은 부호 없는 8비트 데이터에만 해당합니다. 부호가 있거나 더 넓은 정수 배열에 일반화하지 마세요. NumPy는 그런 배열에서도 비트 보수 연산을 수행합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

try:
    import cv2
    import numpy as np
except ImportError:
    print("Install opencv-python and numpy to run this example.")
else:
    input_path = "input.png"
    numpy_output_path = "inverted-numpy.png"
    image = cv2.imread(input_path)

    if image is None:
        print(f"Could not read {input_path}")
    else:
        inverted_numpy = np.invert(image)
        written = cv2.imwrite(numpy_output_path, inverted_numpy)
        if not written:
            print(f"Could not write {numpy_output_path}")

일반적인 8비트 이미지 파일에서는 cv2.bitwise_not(image)과 numpy.invert(image)이 채널별로 같은 결과를 냅니다. 나머지 작업 흐름에서도 OpenCV를 사용한다면 OpenCV 연산을 선택하고, 배열 연산으로 NumPy 함수가 필요한 경우에는 NumPy를 사용하세요.

반전된 이미지 저장 및 표시하기

반전한 이미지에 해당하는 배열을 기록하세요. 컬러 결과에는 cv2.imwrite(output_path, inverted)를, 그레이스케일 결과에는 cv2.imwrite(gray_output_path, inverted_gray)를 사용합니다. 반환된 불리언 값을 확인하세요. False이면 대상 경로를 사용할 수 없거나 형식이 지원되지 않는 경우처럼 OpenCV가 파일을 쓰지 못한 것입니다. 예제는 written으로 결과를 확인하고 쓰기에 실패하면 이를 알립니다.

OpenCV 예제에는 선택 사항인 미리 보기 블록이 있습니다. 두 창을 열려면 해당 블록에서 show_preview를 True로 설정하세요. GUI 표시는 그래픽 환경이 필요하므로 헤드리스 세션에서는 사용할 수 없을 수 있습니다. cv2.imwrite()로 저장할 때는 창을 열 필요가 없습니다. OpenCV 및 NumPy 이미지 파일 예제는 해당 패키지가 설치되어 있고 input.png를 읽을 수 있는 환경을 전제로 합니다. 이 글에 제공된 실행 근거는 위의 간단한 픽셀 계산에만 해당합니다.