OpenCV (6)

Myeongsu Moon·2024년 12월 7일

제로베이스

목록 보기
33/95
post-thumbnail

Chapter7 이진화와 모폴로지 연산

이미지 이진화

  • 이진화를 하는 이유
    -> 데이터 용량 감소: 데이터 크기를 줄여 저장공간과 전송 시간 절약
    -> 처리 속도 향상: 흑백으로 되어 있어, 복잡한 연산 없이 빠르게 이미지 처리 가능
    -> 특징 강조: 특정 요소나 형상을 두드러지게 만들어, 패턴 인식이나 객체 감지에 유용
    -> 잡음 제거: 색상의 복잡성을 줄여, 이미지에서 불필요한 정보나 잡음 제거
    -> 텍스트 인식 용이: 문서 스캔이나 OCR과 같은 작업에서 배경과 텍스트를 명확하게 구분

  • 이진화 과정

image = cv2.imread('example_512.png')

# 그레이스케일로 변환
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 이진화 (임계값 127, 최대값 255, 이진화 타입)
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

  • 처리 방법
    -> cv2.THRESH_BINARY : 픽셀 값이 임계값보다 크면 최대값(보통 255)으로, 그렇지 않으면 0으로 설정
    -> cv2.THRESH_BINARY_INV : THRESH_BINARY의 반대. 임계값보다 작은 값은 최대값으로, 큰 값은 0으로 설정
    -> cv2.THRESH_TRUNC : 픽셀 값이 임계값보다 크면 임계값으로 설정되고, 그렇지 않으면 원래 값 유지
    -> cv2.THRESH_TOZERO : 픽셀 값이 임계값보다 작으면 0으로 설정되고, 그렇지 않으면 원래 값 유지
    -> cv2.THRESH_TOZERO_INV : THRESH_TOZERO의 반대. 임계값보다 큰 값은 0으로 설정되고, 작은 값은 원래 값 유지

  • 적절한 Threshold 찾기
  • 잘 되는 것 사용하기
  • Otsu의 이진화 알고리즘
    -> 히스토그램 계산
    -> 클래스 분리
    -> 분산 계산
    -> 최적 임계값 선택
image = cv2.imread('godard_512.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

모폴로지 연산

  • 이진화된 이미지에 적용되며, 객체의 형태를 변형하고 분석하는데 사용

  • 주요 연산
    -> 침식: 객체의 경계를 축소, 작은 백색 잡음을 제거하거나 객체를 분리하는데 유용
    -> 팽창: 객체의 경계를 확장, 침식으로 인해 사라진 객체의 정보를 복구
    -> 열기: 침식 후 팽창 적용, 작은 객체나 돌출부 제거에 효과적
    -> 닫기: 팽창 후 침식 적용, 작은 홀이나 간격 채우는데 사용
    -> 모폴로지 그레이디언트: 팽창과 침식의 차이의 나타냄, 객체의 윤곽 강조하는데 사용

  • Dot, Hole 그림

src = np.full((500, 500), 0, dtype=np.uint8)

cv2.putText(src, 'HAM', (50, 300), cv2.FONT_HERSHEY_SIMPLEX, 6, 255, 20, cv2.LINE_AA)

noise = np.random.randint(0, 2, (500, 500)).astype(np.uint8) * 255
dot_image = cv2.bitwise_or(src, noise)
hole_image = cv2.bitwise_and(src, noise)

  • 모폴로지 연산
# 구조 요소 정의 (5x5 크기의 정사각형 커널)
kernel = np.ones((5, 5), np.uint8)

# 모폴로지 연산 적용
erosion = cv2.erode(dot_image, kernel, iterations=1)
dilation = cv2.dilate(hole_image, kernel, iterations=1)
opening = cv2.morphologyEx(dot_image, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(hole_image, cv2.MORPH_CLOSE, kernel)

Chapter8 이미지 필터링

  • 필터링: 이미지의 특정 특성을 강조하거나 감소시키기 위해 사용
    -> 이미지의 세부 사항과 텍스처를 줄이는데 효과적, 노이즈 제거나 배경 분리에 유용

  • 필터링 기법
    -> 일반 블러: 이미지를 부드럽게
    -> 가우시안 블러: 일반 블러보다 더 자연스러운 결과 제공
    -> 미디언 블러: 소금-후추 노이즈와 같은 무작위 노이즈 제거에 사용
    -> 양방향 필터: 노이즈를 제거하면서도 가장자리를 보존

  • 일반 블러: 커널내의 모든 픽셀의 평균값을 계산하여 중심 픽셀의 값을 이 평균값으로 대체

blur = cv2.blur(noisy_image, (3,3))

  • 가우시안 블러: 가우시안 함수를 기반으로 한 커널 사용, 중심에 더 큰 가중치를 두고 가장자리로 갈수록 가중치 감소
gaussian_blur = cv2.GaussianBlur(noisy_image, (3,3), 0)
  • 미디언 블러: 커널 내의 모든 픽셀 값을 정렬하고 중간값을 선택하여 중심 픽셀읠 값으로 설정, 무작위 노이즈를 효과적으로 제거하지만, 이미지의 세부 사항을 다소 흐림
median_blur = cv2.medianBlur(noisy_image, 3)

  • 양방향 필터: 공간적 가중치(픽셀 간의 거리 고려), 색상적 가중치(픽셀 간의 색상 차이 고려)를 모두 고려
bilateral_filter = cv2.bilateralFilter(noisy_image, -1, 75, 75)

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다

0개의 댓글