OpenCV-Python 개발 가이드 (8) --- 간단한 색 공간 변환 및 HSV 적용

머리말

이전의 이론적 지식 소개 후 다양한 색 공간 유형을 습득했습니다. 이 블로그 게시물은 주로 코드를 사용하여 OpenCV에서 색상 공간 유형 변환을 달성하는 방법을 소개합니다.

RGB와 GRAY 간 변환

OpenCV에서는 cv2.cvtColor () 함수를 사용하여 색 공간 변환을 수행합니다. 이 함수의 색 공간 유형은 열거 유형으로 표시되며 COLOR_BGR2GRAY 열거 유형은 RGB를 GRAY로 변환하기 위해 특별히 제공됩니다.

구체적인 코드는 다음과 같습니다.

import cv2

img = cv2.imread("4.jpg", -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("rgb", img)
cv2.imshow("gray", gray)
cv2.waitKey()
cv2.destroyAllWindows()

실행 후 효과는 아래 그림과 같습니다.
BGR에서 GRAY로
다음으로 GRAY가 RGB로 변환되는 방식을 살펴 보겠습니다. 구체적인 코드는 다음과 같습니다.

import cv2

img = cv2.imread("4.jpg", 0)
bgr = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.imshow("gray", img)
cv2.imshow("rgb", bgr)
cv2.waitKey()
cv2.destroyAllWindows()

실행 후 표시 효과는 아래 그림과 같습니다.
그레이에서 BGR로
RGB 이미지의 컬러 3D 매트릭스는 BGR이므로 변환 할 때 BGR2GRAY와 GRAY2BGR을 사용합니다. 여기에서 열거 형 상수가 실제로 이해하기 매우 쉽다는 것을 알 수 있으며 변환 유형의 이름을 바꾸는 것 이상입니다.

그러나 그레이 스케일 이미지를 RGB 이미지로 변환하는 것은 변경되지 않는다는 것을 발견했습니다. 그레이 스케일 이미지에는 색상 값이없고 계산은 상상력으로 복원 할 수 없기 때문입니다. 그러나 그레이 스케일 이미지를 RGB 이미지로 변환하는 것은 특정 의미가 있습니다. 색상을 지정해야하는 경우 회색조 이미지는 2 차원 행렬이고 색상 값의 3 차원 행렬이 아니므로 값을 할당 할 수 없습니다. GRAY를 통해 RGB로 변환 한 후 회색 임에도 불구하고 RGB 이미지를 조작하는 것처럼 특정 픽셀의 색상 값을 변경할 수 있습니다.

RGB와 HSV 간 변환

위의 코드와 유사하게 cv2.cvtColor ()를 사용하여 색상 공간을 변환합니다.

import cv2

img = cv2.imread("4.jpg", -1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("bgr", img)
cv2.imshow("hsv", hsv)
cv2.waitKey()
cv2.destroyAllWindows()

실행 후 아래와 같은 이미지를 얻을 수 있습니다.
BGR에서 HSV
이전의 이론적 지식에서 우리는 색조 값에 따라 특정 색상을 얻을 수 있습니다. 즉, HSV의 H 채널 값을 통해 특정 색상을 추출 할 수 있습니다. 이 추출 및 색상 분석의 장점은 얼굴 인식에서 피부색을 식별하는 데 사용할 수 있습니다.

다음으로 파란색으로 시도해 보겠습니다. 구체적인 코드는 다음과 같습니다.

import cv2

img = cv2.imread("4.jpg", -1)
img[:, :, 0] = 255
Blue = img
blueHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("imgBlue", Blue)
cv2.imshow("blueHSV", blueHSV)
cv2.waitKey()
cv2.destroyAllWindows()

실행 후 효과는 다음과 같습니다.
푸른
이제 빨간색 영역을 추출해 보겠습니다. 전체 코드는 다음과 같습니다.

import cv2
import numpy as np

img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
minBlue = np.array([0, 50, 50])
maxBlue = np.array([30, 255, 255])
# 确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
# 通过按位与获取蓝色区域
blue_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("blue", blue_img)
cv2.waitKey()
cv2.destroyAllWindows()

여기에서는 새로운 메소드 cv2.inRange ()를 사용하며 정의는 다음과 같습니다.

def inRange(src, lowerb, upperb, dst=None):

src : 확인할 배열 또는 아바타를 나타냅니다.

lowerb : 범위의 하한을 나타냅니다.

upperb : 범위의 상한을 나타냅니다.

이 방법을 통해 영상 속 픽셀의 픽셀 값이 일정한 간격에 있는지 확인할 수 있습니다.

이전의 이론적 설명 후 HSV의 H가 0이고 빨간색이라는 것을 알고 있습니다. 호환성을 위해 빨간색 값을 위아래로 확장해야하지만 색상 범위 자체는 0보다 작을 수 없으므로 상한 만 확장 할 수 있습니다. 즉, 범위를 30으로 확장 할 수 있습니다.

HSV의 S 채널의 경우 V 채널의 값 범위는 [100,255]입니다. . 그러므로, 이미지의 적색 값을 획득하기 위해, 우리는 [0, 50, 50] [30, 255, 255, 화상의 붉은 색이 추출되어 실행 한 후하기에 한계 제한
빨간색 추출
알 수있는 바와을 이 예제에서 cv2.inRange ()를 통해 이미지에 지정된 범위의 값을 표시하고 마스크로 돌아갈 수 있습니다. 이미지 값이이 간격에 있으면 해당 마스크 위치의 값은 255이고, 그렇지 않으면 0입니다. 그런 다음 마스킹의 비트 AND 연산에 의해 지정된 색상이 제거됩니다.

여기서 bitwise_and에는 마스크를 사용하여 "AND"연산을 수행하는 세 번째 매개 변수 마스크가 있습니다. 즉, 마스크 이미지의 흰색 영역은 처리해야하는 이미지 픽셀의 예약이고 검은 색 영역은 처리해야하는 이미지 픽셀을 제거하는 것입니다.

추천

출처blog.csdn.net/liyuanjinglyj/article/details/113795768