OpenCV Review 04

2400·2025년 3월 9일
post-thumbnail

점 연산

감마 보정

def gamma(f,gamma=1.0):
    f1=f/255.0
    return np.uint8((255*(f1**gamma)))
    
    """
    감마 보정을 적용하는 함수
    
    Parameters:
        f (ndarray): 입력 이미지
        gamma (float): 감마 값, 기본값은 1.0
    
    Returns:
        ndarray: 감마 보정이 적용된 이미지
    """
gc = np.hstack((gamma(img,0.5),gamma(img,0.75),gamma(img,1.0),gamma(img,2.0),gamma(img,3.0)))         

히스토그램 평활화

히스토그램이 평평하게 되도록 영상을 조작해서 명암 대비를 높이는 기법
=> 물체를 더 잘 식별가능함

# OpenCV와 Matplotlib
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread("./.data/segmentation.png")

# 컬러 이미지를 그레이스케일로 변환
# BGR 이미지를 그레이스케일로 변환하여 픽셀당 1개의 채널만 가지도록 함
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 그레이스케일 이미지 출력
plt.imshow(gray, cmap="gray"),  # 그레이스케일 이미지 표시 (cmap='gray'로 그레이스케일 컬러맵 사용)
plt.xticks([]),  # x축 눈금 제거
plt.yticks([]),  # y축 눈금 제거
plt.show()  # 그래프 표시

# 원본 그레이스케일 이미지의 히스토그램 계산
# 히스토그램: 이미지의 픽셀 값 분포를 보여주는 그래프
h = cv.calcHist(
    [gray],  # 히스토그램을 계산할 이미지 (리스트 형태로 제공)
    [0],     # 채널 인덱스 (그레이스케일은 채널이 1개이므로 0)
    None,    # 마스크 (None은 전체 이미지 사용)
    [256],   # 히스토그램 구간(bin) 개수
    [0, 256] # 계산할 픽셀 값 범위 (0-255)
)

# 원본 이미지의 히스토그램 표시
plt.plot(h, color='r', linewidth=1),  # 빨간색 선으로 히스토그램 그래프 그리기
plt.show()  # 그래프 표시

# 히스토그램 평활화 적용
# 히스토그램 평활화: 픽셀 값의 분포를 균일하게 만들어 대비(contrast)를 향상시키는 기법
equal = cv.equalizeHist(gray)

# 히스토그램 평활화가 적용된 이미지 출력
plt.imshow(equal, cmap='gray'),  # 평활화된 그레이스케일 이미지 표시
plt.xticks([]),  # x축 눈금 제거
plt.yticks([]),  # y축 눈금 제거
plt.show()  # 그래프 표시

# 평활화된 이미지의 히스토그램 계산
h = cv.calcHist(
    [equal],  # 히스토그램을 계산할 평활화된 이미지
    [0],      # 채널 인덱스
    None,     # 마스크
    [256],    # 히스토그램 구간(bin) 개수
    [0, 256]  # 계산할 픽셀 값 범위
)

# 평활화된 이미지의 히스토그램 표시
plt.plot(h, color='r', linewidth=1),  # 빨간색 선으로 히스토그램 그래프 그리기
plt.show()  # 그래프 표시

영역 연산 영역 연산

컨볼루션

컨볼루션은 이미지 처리에서 가장 기본적이고 중요한 연산으로, 각 화소(픽셀)에 필터(또는 커널)를 적용하여 곱의 합을 구하는 연산.

기본 개념

  • 정의: 입력 이미지의 각 픽셀과 그 주변 픽셀들에 필터(커널)를 적용하여 새로운 픽셀 값을 계산하는 과정
  • 목적: 이미지의 특정 특성(예: 에지, 블러, 샤프닝 등)을 강조하거나 추출

작동 원리

  1. 필터(커널)를 이미지 위에 올려놓는다 (보통 3x3, 5x5 크기의 행렬)
  2. 필터가 덮고 있는 이미지 영역의 각 픽셀 값과 필터의 해당 요소를 곱한다
  3. 곱해진 모든 값을 더한다
  4. 결과 값을 출력 이미지의 중심 픽셀 위치에 저장한다
  5. 필터를 한 픽셀씩 이동하며 이 과정을 반복한다
import cv2
import numpy as np

# 이미지 로드
img = cv2.imread('image.jpg', 0)  # 그레이스케일로 로드

# 커널 정의 (3x3 평균 필터)
kernel = np.ones((3, 3), np.float32) / 9

# 컨볼루션 적용
filtered_img = cv2.filter2D(img, -1, kernel)

# 또는 OpenCV의 내장 함수 사용
blurred_img = cv2.blur(img, (3, 3))  # 평균 블러
gaussian_img = cv2.GaussianBlur(img, (3, 3), 0)  # 가우시안 블러

주요 응용 분야

  1. 스무딩(블러링): 노이즈 제거, 이미지 부드럽게 만들기

    • 평균 필터, 가우시안 필터 등
  2. 샤프닝: 이미지의 디테일과 에지를 강조

    • 언샵 마스크 필터
  3. 에지 검출: 이미지에서 경계선 추출

    • 소벨 필터, 프리윗 필터, 라플라시안 필터
  4. 특징 추출: 이미지에서 특정 패턴이나 특징 검출

    • HOG(Histogram of Oriented Gradients), SIFT 등

파라미터 및 고려사항

  • 커널 크기: 커널이 클수록 더 넓은 영역에 영향을 미침
  • 패딩: 이미지 가장자리 처리 방법 (zero padding, replicate 등)
  • 스트라이드: 필터 이동 간격

컨볼루션은 이미지 처리뿐만 아니라 딥러닝의 CNN(Convolutional Neural Network)에서도 핵심 연산으로 사용.

profile
시즌 2의 공부기록 - Artificial Intelligence & AeroSpace

0개의 댓글