OpenCV Review 03

2400·2025년 3월 8일
post-thumbnail

영상처리란 뭔가? =>영상처리는 특정 목적을 당성하기 위해 원래 영상을 개선된 영상으로 변환하는 작업이다.

컴퓨터 비전은 이 영상처리를 전처리 단계에서 활용하고 개선된 영상을 인식알고리즘에 입력하여 인식 성능을 높이는 것을 목적으로 한다.

RGB 컬러

RGB는 Red(빨강), Green(초록), Blue(파랑)의 세 가지 색상을 조합하여 색을 표현하는 방식이다.

원리: 빛의 삼원색을 기반으로 함
범위: 각 색상 채널은 보통 0~255 값을 가짐 (8비트)
표현: (R, G, B) 형태로 표현 (예: 빨강은 (255, 0, 0))
특징: 가산 혼합(색을 더할수록 흰색에 가까워짐)
활용: 디스플레이 장치에서 직접적으로 사용되며 디지털 이미지 저장 방식

HSV 컬러

HSV는 Hue(색상), Saturation(채도), Value(명도)를 기반으로 색을 표현한다.

Hue(색상): 색상의 종류를 나타내며 0~360도 범위의 각도로 표현

0/360도: 빨강, 120도: 초록, 240도: 파랑

Saturation(채도): 색의 선명도, 0~100% (0%는 회색)
Value(명도): 색의 밝기, 0~100% (0%는 검정)
특징: 인간이 색을 인식하는 방식에 더 가까움
활용: 이미지 처리, 색상 선택기, 컴퓨터 비전에서 색상 인식에 유용

OpenCV 이미지 슬라이싱

cv.imshow("seulgi",img)

cv.imshow("seulgi upper left half",img[0:img.shape[0]//2, 0:img.shape[1]//2,:])

cv.imshow("seulgi Center half", img[img.shape[0]//4:3 * img.shape[0]//4, img.shape[1]//4:3 * img.shape[1]//4,:])

세로, 가로, 채널 순이다.

  1. 첫 번째 매개변수 (세로/높이 방향): y_start:y_end

img.shape[0]: 이미지의 전체 높이(행 수)
0: 이미지의 맨 위 (원점)
img.shape[0]//2: 이미지 높이의 절반 지점
img.shape[0]//4: 이미지 높이의 1/4 지점
3*img.shape[0]//4: 이미지 높이의 3/4 지점

  1. 두 번째 매개변수 (가로/너비 방향): x_start:x_end

img.shape[1]: 이미지의 전체 너비(열 수)
0: 이미지의 맨 왼쪽 (원점)
img.shape[1]//2: 이미지 너비의 절반 지점
img.shape[1]//4: 이미지 너비의 1/4 지점
3*img.shape[1]//4: 이미지 너비의 3/4 지점

  1. 세 번째 매개변수 (색상 채널): channels

:: 모든 채널 선택 (일반적으로 BGR 순서)
0: 파란색(B) 채널만 선택
1: 초록색(G) 채널만 선택
2: 빨간색(R) 채널만 선택
[0, 2]: 파란색과 빨간색 채널만 선택 (초록색 제외)

오츄 알고리즘

오츄 알고리즘(Otsu's Method)은 이미지 이진화를 위한 자동 임계값 선택 방법이다.

오츄 알고리즘의 핵심 개념
오츄 알고리즘은 이미지 픽셀을 두 클래스(전경과 배경)로 분리하는 최적의 임계값을 자동으로 계산한다.

각 가능한 임계값에 대해 클래스 간 분산(between-class variance)을 계산
이 클래스 간 분산을 최대화하는 임계값을 선택

이 방법은 특히 히스토그램이 쌍봉(bimodal) 분포를 보이는 이미지에서 효과적이다.

OpenCV에서는 cv2.threshold() 함수와 cv2.THRESH_OTSU 플래그를 사용하여 오츄 방법을 적용할 수 있다

t, bin_img = cv.threshold(img[:,:,2],0,255,cv.THRESH_BINARY + cv.THRESH_OTSU)

모폴로지

모폴로지(Morphology) 연산은 이미지 처리에서 객체의 형태를 변형하거나 분석하는 기술이다.

# 1. 이미지 읽기
# cv.imread(파일경로, 플래그) - 이미지를 NumPy 배열로 읽어옴
img = cv.imread('image.jpg', cv.IMREAD_UNCHANGED)  # 알파 채널 포함 원본 그대로 읽기
# 플래그 옵션: cv.IMREAD_COLOR (기본값), cv.IMREAD_GRAYSCALE, cv.IMREAD_UNCHANGED

# 2. 이진화 (임계값 처리)
# cv.threshold(입력이미지, 임계값, 최대값, 임계값유형) - 픽셀값을 이진화
t, bin_img = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
# 오츄 알고리즘을 사용한 자동 임계값 설정
t, otsu_img = cv.threshold(gray_img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

# 3. 이미지 슬라이싱 (관심 영역 추출)
# img[y_start:y_end, x_start:x_end] - NumPy 배열 슬라이싱으로 영역 추출
roi = img[100:300, 200:400]  # (y축 100~300, x축 200~400) 영역 추출

# 4. 모폴로지 연산 - 구조 요소(커널) 정의
# np.uint8([...]) - 구조 요소를 2차원 배열로 정의
se = np.uint8([[0,1,0],
               [1,1,1],
               [0,1,0]])

# 5. 팽창 연산
# cv.dilate(입력이미지, 구조요소, 반복횟수) - 객체 확장
dilated = cv.dilate(binary_img, kernel, iterations=1)

# 6. 침식 연산
# cv.erode(입력이미지, 구조요소, 반복횟수) - 객체 축소
eroded = cv.erode(binary_img, kernel, iterations=1)

# 7. 모폴로지 복합 연산
# cv.morphologyEx(입력이미지, 연산유형, 구조요소) - 복합 모폴로지 연산 수행
# 닫기 연산 (팽창 후 침식)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
# 열기 연산 (침식 후 팽창)
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

# 8. Matplotlib으로 이미지 시각화
# plt.imshow(이미지, 컬러맵) - 이미지 표시
plt.imshow(img, cmap='gray')  # 그레이스케일 이미지 표시
plt.xticks([]), plt.yticks([])  # 축 눈금 제거
plt.show()  # 그래프 창 표시
profile
시즌 2의 공부기록 - Artificial Intelligence & AeroSpace

0개의 댓글