Python에서 OpenCV를 사용한 이미지 색상 감지

Manav Narula 2023년1월30일
  1. Python에서 OpenCV 라이브러리를 사용한 이미지 색상 감지
  2. 결론
Python에서 OpenCV를 사용한 이미지 색상 감지

OpenCV 라이브러리는 Computer Vision 작업을 돕기 위해 만들어졌으며 다양한 프로그래밍 언어와 호환됩니다. 라이브러리에는 이미지를 처리하는 데 유용한 다양한 알고리즘과 기술이 구현되어 있습니다.

이 자습서에서는 Python의 OpenCV 라이브러리를 사용하여 이미지에서 색상 감지를 수행하는 방법을 보여줍니다.

색상 감지를 위한 다양한 응용 프로그램이 있습니다. 실생활에서 사물을 구별하는 데 사용할 수 있습니다. 유사한 특성을 기반으로 모든 픽셀에 레이블을 지정하려고 할 때 이는 이미지 분할 기술로 간주될 수도 있습니다.

Hue Saturation Value를 나타내는 HSV 색 공간을 사용하여 색상을 감지합니다. 이것은 색상 정보로 작업할 때 매우 유용한 원통형 색상 공간입니다.

Hue는 색상 정보를 결정하고 Saturation은 색상의 강도를 나타내며 Value는 색상이 검정색과 얼마나 혼합되어 있는지에 따라 밝기를 결정합니다.

Python에서 OpenCV 라이브러리를 사용한 이미지 색상 감지

색상 감지를 위해 OpenCV 라이브러리의 다양한 기능을 사용할 것입니다. 아래에서 논의해 보겠습니다.

주어진 이미지에서 하나의 특정 색상을 감지하고 감지된 세그먼트 주위에 경계를 추가합니다.

필요한 이미지를 BGR 색 공간에서 HSV로 변환해야 합니다. 이미지에서 이러한 변환을 수행하려면 OpenCV 라이브러리에서 cvtColor() 함수를 사용할 수 있습니다.

주어진 색상에 대한 경계가 필요하고 이미지에 색상이 있는 위치의 이진 마스크를 반환합니다. OpenCV의 inRange() 함수는 주어진 이미지를 가져와서 현재 지정된 상한 및 하한을 기반으로 하는 색상의 이진 마스크를 반환합니다.

이 마스크는 색상이 감지되는 이미지의 하위 집합입니다.

그런 다음 원치 않는 노이즈를 필터링하기 위해 이 이진 마스크에 형태학적 연산을 적용할 수 있습니다. 이를 달성하기 위해 OpenCV 라이브러리의 morphologyex() 함수를 사용할 것입니다.

팽창 후 침식을 수행하여 개체의 작은 구멍을 닫습니다.

또한 생성된 이진 마스크를 사용하여 이미지에 경계를 추가해야 합니다.

bitwise_and()는 주어진 마스크와 일치하는 이미지 부분을 분할하는 데 사용됩니다. 마스크는 ‘mask’ 매개변수를 사용하여 제공됩니다.

소스 이미지의 모든 픽셀을 비교하고 지정된 마스크의 해당 픽셀과 일치시킵니다.

이 분할된 이미지에 경계를 추가하기 위해 findContours()drawContours()라는 두 가지 방법을 사용합니다. 이 윤곽은 일부 분할된 이미지의 경계를 따라 점을 연결하는 곡선으로 생각할 수 있습니다.

첫 번째 함수는 주어진 이미지에 대한 모든 등고선 목록을 반환합니다. 우리는 윤곽을 그리기 위해 drawcontours() 함수를 사용할 것입니다.

이제 색상 감지를 위한 코드를 구현하고 다음 이미지에서 녹색을 찾아보겠습니다.

색상 감지용 샘플 이미지

암호:

import cv2
import numpy as np

img = cv2.imread("img3.jpeg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])

mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7, 7), np.uint8)

mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)

seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(
    mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)

cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()

출력:

Python에서 OpenCV를 사용하여 감지된 녹색

이제 구현된 코드에 대해 간략히 살펴보겠습니다.

imread() 함수는 이미지를 읽습니다. cvtColor() 함수를 사용하여 이 이미지의 색 공간을 BGR에서 HSV로 변환했습니다. 함수 내의 cv2.COLOR_BGR2HSV 매개변수에 유의하십시오.

그런 다음 이미지에서 녹색을 감지하기 위해 상한 및 하한 값을 지정하고 inRange() 함수를 사용하여 이진 마스크를 만들었습니다.

morphologyEx() 함수를 사용하여 이 마스크에서 노이즈를 두 번 제거합니다.

처음으로 cv2.MORPH_CLOSE 매개변수를 사용하여 검은 부분에서 백색 잡음을 필터링했습니다. 그리고 두 번째로 cv2.MORPH_CLOSE를 사용하여 흰색 부분에서 블랙 노이즈를 필터링했습니다.

그런 다음 분할된 부분에 경계를 그렸습니다. findContours()를 사용하여 분할된 부분과 윤곽을 결정하고 drawContours() 메서드로 경계를 그렸습니다.

결론

이 자습서에서는 Python에서 OpenCV를 사용하여 색상 감지를 수행하는 방법에 대해 설명했습니다. 우리는 이미지로 작업했고 녹색과 일치하는 부분을 감지했습니다.

이와 관련된 몇 가지 단계가 있습니다. 이미지를 올바른 HSV 색상 공간으로 변환하고 필요한 색상에 대한 마스크를 만들어야 합니다.

그런 다음 이 마스크에서 노이즈를 필터링해야 합니다. 그런 다음 이 마스크를 원본 이미지와 함께 사용하여 감지된 부분을 분할하고 그 위에 경계를 그립니다.

작가: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

관련 문장 - Python OpenCV