이미지를 부드럽게 그리고 날카롭게 만들어보기

2021. 2. 17. 17:41Image processing

픽셀 처리는 단일 픽셀 처리픽셀 그룹 처리로 나눌 수 있다.

  의미 종류
단일 픽셀 처리 이웃 픽셀과는 독립적으로 입력 영상의 각 픽셀 값을 변환한 후 결과 영상의 동일한 위치에 출력하는 연산 산술연산, 논리연산, 그레이스케일, 고정 임계값으로 이진화
픽셀 그룹 처리 출력 영상의 새로운 픽셀 값을 결정 할 때 그 주위의 이웃 픽셀들도 함께 고려하는 공간 영역 연산, 컨볼루션 연산으로 처리 블러링 & 샤프닝, 가변 임계값으로 지역 이진화

 

👀 컨볼루션 연산 (Convolution, 합성곱)

처리하고 하는 픽셀 값을 이웃 픽셀과 각각에 대응하는 2차원 배열 내의 가중치(필터의 값)를 곱하여 곱한 값들을 모두 더한 값으로 변경하는 연산

 

필터 (Filter, Mask)

입력되는 신호의 일부 성분을 제거하거나 일부 특성을 변경하기 위해 설계된 하나의 시스템

 

✌ cv2.filter2D(src, ddepth, kernel)

컨볼루션 연산을 수행하는 함수로 src는 입력 영상, ddepth는 출력 영상의 데이터 타입으로 -1로 지정하면 입력 영상과 같은 데이터 타입으로 생성한다. kernel은 필터 행렬의 값이다.

 

 

👀 이진화

어떤 주어진 임계값(threshold) 보다 밝은 픽셀들을 모두 흰색으로 그렇지 않은 픽셀들은 모두 검은색으로 바꾸는 작업이다.

 

1️⃣ 전역 이진화

단일 픽셀 처리의 종류인 전역 이진화각 픽셀 값이 고정 임계값보다 작으면 0, 크면 255로 픽셀 값을 변경한다. 

 

✌ cv2.threshold(src, thresh, maxval, type)

전역 이진화 함수로써 src는 입력 영상, thresh는 임계값, maxval은 임계값보다 클 때 적용되는 최댓값, type은 임계값 적용 방법이다.

 

코드에서의 임계값은 127이고 maxval은 255, cv2.THRESH_BINARY은 픽셀 값이 thresh보다 크면 maxval, 작으면 0으로 할당하는 임계값 적용 방법이다.

 

전역 이진화는 임계값이 고정되어있다보니 밝기 변화가 심한 영상에는 임계값 설정이 어렵다.

 

2️⃣ 지역 이진화

전역 이진화의 단점을 개선하기 위해 가변 임계값을 사용하는 지역 이진화가 있다. 픽셀 그룹 단위마다 임계값을 설정하고 그 값보다 작으면 0, 크면 255로 픽셀 값을 변경한다.

 

✌ cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

지역 이진화 함수로써 src는 입력 영상, maxvalue는 임계값보다 클 때 적용되는 최댓값, adaptiveMethod는 적용할 지역 이진화 알고리즘, thesholdType은 임계값 적용 방법, blocksize는 지역 이진화를 할 때 고려할 주변 픽셀 크기 (블록 크기), C는 블록 내 평균값에서 뺄 값(임계값을 결정하는 파라미터)을 의미한다.

 

여기서 cv2.ADAPTIVE_THRESH_MEAN_C는 주변 영역의 평균값으로 지역 이진화를 하겠다는 것을 의미한다.

 

 

💡 블러링 (Blurring)

이웃 픽셀들의 차이를 감소시켜 영상을 부드럽게 만드는 기법으로 영상의 잡음(Noise)을 제거하기 위해 쓰인다.

블러링에 사용되는 필터로는 평균값 필터, 미디언 필터, 가우시안 필터가 있다.

 

1️⃣ 평균값 필터

영상의 특정 픽셀과 주변 픽셀등의 산술 평균을 결과 영상 픽셀 값으로 설정하는 필터로써 가장 간편하게 사용할 수 있는 블러링 방법이다. 필터의 크기가 커질수록 더 흐려진다.

 

1. 3 X 3 평균 값 필터 사용하기

2. 5 X 5 평균 값 필터 사용하기

 

5 X 5 평균값 필터를 사용할 시 더 흐려지는 것을 확인할 수 있다 ❗

 

2️⃣ 미디언 필터

입력 영상에서 주변 픽셀들의 값들을 오름 또는 내림차순으로 정렬하여 그 중앙에 있는 값으로 픽셀 값을 대체하는 방식의 필터로 소금 & 후추 잡음을 효과적으로 제거한다.

 

✌ cv2.medianBlur(src, ksize)

src는 입력 영상, ksize는 필터의 크기를 의미한다. 필터의 크기는 3,5,9를 가질 수 있다.

 

 

3️⃣ 가우시안 필터

가우시안 분포를 이용한 정규화 필터로써 모든 가우시안 필터의 합은 1이다. 빠른 처리가 가능하다.

 

3 X 3의 가우시안 필터와 5 X 5의 가우시안 필터를 적용하였다. 자세히 보면 크기가 5인 필터가 더 흐리다.

 

✌ cv2.getGaussianKernel(ksize, sigma, ktype)

가우시안 필터를 만들어주는 함수로써 ksize는 필터 크기, sigma는 가우시안 함수 식 중 시그마 값, ktype은 필터 타입을 의미하며 default 값은 float64이다. 

 

 

💡 샤프닝 (Sharpening)

이웃 픽셀들의 차이를 크게 만들어 영상을 날카롭게 만드는 기법이다.

 

총 3가지의 샤프닝 필터가 존재한다.

 

오른쪽으로 갈수록 더욱 샤프닝 된 사진이 출력되는 것을 확인할 수 있다.