Ch3. 영상 처리

wonnie1224·2023년 4월 5일
0

3.1 디지털 영상 기초

3.1.1 영상 획득과 표현

디지털 카메라 - 실제 세상의 피사체를 일정한 간격으로 샘플링(sampling & 명암을 일정한 간격으로 양자화(quantization) ⇒ 디지털 영상 획득

📌 핀홀 카메라 & 디지털 변환

  1. 물체에 반사된 빛 → 카메라의 작은 구멍을 통해 안으로 들어가 영상 평면에 맺힘

(영상 평면 = 눈의 망막 = 필름카메라의 필름 = 디지털카메라의 CCD센서)

  1. CCD 센서 : 아날로그 신호(=빛) → 디지털 신호로 변환한 영상을 메모리에 저장
    • 이때 샘플링 & 양자화 수행

Untitled

1) 샘플링 : 2차원 영상 공간을 가로로 N개, 세로로 M개 구간으로 나눔

  • 화소(픽셀) = 나눠진 한 점
  • 영상의 크기 or 해상도 = M*N

2) 양자화 : 화소의 명암을 L개 구간으로 나눔

  • 보통 1byte 표현 가능하도록 L=256 사용

Untitled

📌 영상 좌표계 : (y,x)와 (x,y) 표기

Untitled

  • 원점 = 왼쪽 위
  • 화소의 위치 지정할 때 좌표 (y,x)순으로 표기
  • 영상 객체 - ndarray 타입 ⇒ img.max()/min()/mean()으로 화소의 최곳값/최솟값/평균값 계산 가능

3.1.2 다양한 종류의 영상

📌 물체가 반사한 빛을 측정한 디지털 영상

  • 명암 영상 : 2차원 구조의 배열로 표현
  • 컬러 영상 : RGB 3개 채널로 구성된 컬러 영상, 3차원 구조의 배열로 표현
  • 컬러 동영상 : 4차원 구조의 배열로 표현
  • 다분광/초분광 영상 : 컬러 영상과 동일한 3차원 구조의 배열로 표현 but 3번째 축 크기가 3 → 3보다 큰 값으로 확장됨
    • 다분광 영상 : 자외선, 적외선 영역까지 확장 → 3~10개 채널
    • 초분광 영상 : 다분광보다 조밀하게 획득한 수백~수천 개 채널

📌 물체까지 거리를 측정한 영상 : 깊이 영상 or 레인지 영상

  • 거리 = 깊이 depth = 레인지 range
  • RGB-D 영상 : 컬러 센서 + 깊이 센서 통합 카메라로 획득
  • 점 구름 영상 : 라이다로 획득

Untitled

3.1.3 컬러 모델

HSV 컬러 모델

  • H : 색상
  • S : 채도
  • V : 명암

RGB 모델 : 빛의 밝기가 RGB 3요소에 섞여 있음 → 빛 약해지면 값에 영향

⇒ HSV 모델에선 색상 → H요소, 빛의 밝기 → V요소에 집중

3.1.4 RGB 채널별로 디스플레이

  • B : img[:,:,0]
  • G : img[:,:,1]
  • R : img[:,:,2]

Untitled

3.2 이진 영상

  • 이진 영상(binary image) : 화소가 0(흑) or 1(백)인 영상

ex) 에지 검출 후 에지만 1로 표현, 물체 검출 후 물체 - 1/배경 - 0으로 표시

3.2.1 이진화

  • 명암 영상 이진화 : 임곗값 T보다 큰 화소 → 1 / 작은 화소 → 0로 변환 (f : 원래 명암 영상, b : 이진 영상)

Untitled

  • 임곗값 T 결정이 중요!
    • 너무 낮게 / 높게 설정 시 대부분의 화소가 물체 / 배경에 쏠리는 문제 발생
    • 히스토그램의 계곡 근처 값으로 설정 → 쏠림 현상 방지
    • 히스토그램 : 0,1,~,L-1의 명암 단계에 대해 화소 발생 빈도 나타내는 1차원 배열
    • but 실제 영상은 크기 큼 & 명암 단계 256임 & 계곡 불분명한 문제 → 계곡 근처를 임계값으로 정하기 어려움 ⇒ 오츄 알고리즘 등장

3.2.2 오츄 알고리즘

  • 모든 명암값에 대해 목적 함수 J가 최소인 명암값을 최적값으로 결정 ⇒ 임곗값 T로 사용

Untitled

  • 목적 함수 J(t) : t의 좋은 정도 측정, 작을수록 좋음
  • J : 이진화 시행 후 0이 되는 화소의 분산 & 1이 되는 화소의 분산의 가중치 합 (가중치 : 해당 화소의 개수)
    • n : 화소 개수, v : 화소의 분산

      Untitled

  • 분산 작을수록 0 & 1인 화소 균일하다는 뜻 ⇒ 좋은 이진 영상!
  • 최적화 문제로써 모든 t 검사하는 낱낱 탐색 알고리즘 사용

🌿 ex 3-3. 오츄 알고리즘으로 이진화하기

import cv2 as cv
import sys

img=cv.imread('soccer.jpg')

t,bin_img=cv.threshold(img[:,:,2],0,225,cv.THRESH_BINARY+cv.THRESH_OTSU)
print('오츄 알고리즘이 찾은 최적 임계값=',t)

cv.imshow('R channel',img[:,:,2])
cv.imshow('R channel binarization',bin_img)

cv.waitKey()
cv.destroyAllWindows()

Untitled

3.2.3 연결 요소

연결 요소(connected component) : 이진 영상에서 1의 값을 가진 연결된 화소의 집합

Untitled

3.2.4 모폴로지

  • 영상 변환 과정에서 물체 1개가 여러 영역으로 분리 / 다른 물체가 한 영역으로 붙는 부작용 발생 ⇒ 모폴로지 연산으로 방지
  • 이진 영상을 위한 모폴로지
  • 구조 요소 이용해 영역의 모양 조작

📌 팽창 & 침식 연산

  • 모폴로지의 기본 연산
  • 구조 요소 모양에 따라 결과 달라짐

1) 팽창 : 구조 요소의 중심을 1인 화소에 씌운 후, 구조 요소인 모든 화소를 1로 바꿈

  • 작은 홈 메우거나 끊어진 영역을 하나로 연결 ⇒ 영역을 키움

2) 침식 : 구조 요소의 중심을 1인 화소 p에 씌운 후, 구조요소인 모든 화소가 1인 경우에 p를 1로 유지, 아닌 경우엔 0으로 바꿈

  • 영역의 경계에 솟은 돌출 부분 깎음 ⇒ 영역을 작게 만듦

+) 팽창 & 침식 모두 적용하는 경우

  • 열림 : 침식한 결과에 팽창 적용하는 연산
  • 닫힘 : 팽창한 결과에 침식 적용하는 연산

3.3 점 연산

💡 화소가 새로운 값을 어디에서 받느냐에 따라 구분

1) 점 연산 : 자기 자신으로부터 값 받음 ex) 오츄이진화

2) 영역 연산 : 이웃 화소의 값을 보고 새로운 값 결정 ex) 모폴로지

3) 기하 연산 : 기하학적 변환에 따라 다른 곳으로부터 값 받음

Untitled

3.3.1 명암 조절

Untitled

1) 밝게 : 원래 영상 + 양수 a

  • 최댓값 L-1 넘지 않게 min 취함

2) 어둡게 : 원래 영상 - 양수 a

  • max 취해 음수 방지

3) 반전 : (L-1) - 원래 명암값

📌 감마 보정 : 인간의 눈 - 빛의 밝기 변화에 비선형적으로 반응하는 것을 수학적으로 표현

Untitled

  • fdot : [0, L-1] 범위의 화소 값을 L-1로 나누어 [0,1] 범위로 정규화한 영상
  • γ : 사용자 조정값
    • γ = 1; 원래 영상 유지
    • γ < 1; 밝아짐
    • γ > 1; 어두워짐

Untitled

3.3.2 히스토그램 평활화

: 히스토그램이 평평하게 되도록 영상 조작 → 영상의 명암 대비를 높이는 기법

Untitled

  • l : 원래 명암값
  • l’ : 평활화로 얻은 새로운 명암값
  • h dot : 정규화 히스토그램 (모든 칸의 값 더하면 1)
  • h 2dot : 누적 정규화 히스토그램 (i번 칸 : 0~i번 칸 더한 값 가짐)
import cv2 as cv
import matplotlib.pyplot as plt

img=cv.imread('soccer.jpg')

gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
plt.imshow(gray,cmap='gray'), plt.xticks([]), plt.yticks([]), plt.show()

h=cv.calcHist([gray],[0],None,[256],[0,256])
plt.plot(h,color='r',linewidth=1), plt.show()

equal=cv.equalizeHist(gray)
plt.imshow(equal,cmap='gray'), plt.xticks([]), plt.yticks([]), plt.show()

h=cv.calcHist([equal],[0],None,[256],[0,256])
plt.plot(h,color='r',linewidth=1), plt.show()

평활화 전

Untitled

Untitled

평활화 후

Untitled

Untitled

3.4 영역 연산

3.4.1 컨볼루션 (convolution)

  • 컨불루션 : 입력 영상 f의 각 화소에 필터를 적용해 곱의 합을 구하는 연산
  • 곱의 합은 해당하는 화소끼리 곱한 후 결과를 더함

📌 1차원 컨볼루션

Untitled

Untitled

📌 2차원 컨볼루션

Untitled

  • 2차원 필터 크기 : h x w
  • 보통 h = w, 대칭성 위해 홀수 사용
  • 가장자리 화소는 필터 밖으로 튀어나가서 못 씌움 → 원래 영상에 덧대는 padding(0 padding, copy padding) 사용
  • 다음 화소 값 계산 시 이웃 화솟값 바뀌어 있으면 X → 입력 영상 f 자체에 기록X, 출력 영상 f’에 기록해야 함

Untitled

3.4.2 다양한 필터

  • 수직 에지 검출 필터 (위의 그림 b)

📌 스무딩 필터(smoothing filter) : 영상의 잡음 제거 효과

ex) 입력 영상의 해당 9개 화소의 평균 취함

⇒ 어떤 점의 값이 주위에 비해 아주 낮을 때 자신은 커지고 주위는 작아져서 잡음을 누그러뜨리는 효과 발휘

ex) 중심의 값이 가장 크고 중심에서 멀어질수록 작아지는 가우시안 함수에 따라 제작

Untitled

but 물체의 경계를 흐릿하게 만드는 블러링 있음

📌 샤프닝 필터(sharpening filter) : 에지를 선명하게 해서 물체의 식별 도움

but 부작용으로 잡음 확대함

📌 엠보싱 필터(embossing filter): 물체에 돋을새김 느낌 줌

Untitled

3.5 기하 연산

3.5.1 동차 좌표와 동차 행렬

  • 동차좌표 : 2차원 점의위치 (x,y)에 1 추가 → 3차원 벡터 (x,y,1) 로 표현
  • 동차좌표에선 3개 요소에 같은 값을 곱하면 같은 좌표 나타냄

Untitled

3.5.2 영상의 기하 변환

  • 화소 위치를 정수로 지정해서 문제 생김

but 실수 좌표를 정수로 반올림하면 값을 받지 못하는 화소 발생

Untitled

  • 에일리어싱 aliasing : 시각적으로 불만스러운 현상
  • 안티 에일리어싱 anti-aliasing **:** 에일리어싱을 누그러뜨리는 방법
  • 변환영상이 원래 영상의 해당 화소를 찾는 후방변환 사용
  • 후방 변환 : 변환행렬 A의 역행렬인 A^-1 사용

3.5.3 영상 보간

  • 최근접 이웃 nearest neighbor 방법 : 반올림 사용해 가장 가까운 화소에 배정하는 기법 에일리어싱 심함 ⇒ 보간 사용하여 개선
  • 4개 화소와 걸친 비율에 따라 가중평균하여 화솟값 계산

Untitled

  • 양선형 보간법 : x,y 두 방향 고려 & 겹치는 비율 곱하는 선형 보간
  • 양3차 보간법

⇒ 최근접 이웃 방법에 비해 화질 굿

3.6 OpenCV의 시간 효율

  • 함수의 처리 시간으로 시간 효율 분석 가능
  • 동일한 기능의 사용자 정의 함수보다 OpenCV 제공 함수가 더 속도 빠름
profile
안녕하세요😊 컴퓨터비전을 공부하고 있습니다 🙌

0개의 댓글