본문 바로가기
Study(Data Analysis, OpenCV, Python, AI)/OpenCV-Python

07.영역 처리

by emergensaur 2024. 4. 29.

공간영역(spatial domain)이나 주파수 영역(frequency domain)에 대한 이해를 먼저 진행하고 해야 한다. 공간 영역에서 처리는 대부분 '마스크' 또는 '윈도'라 불리는 커널(kernel)을 이용해서 회선 (convolution)을 수행함으로써 이루어진다. 

여기서의 영역처리는 ======공간 영역을 의미! 영역을 정의하는 방법 중 공간에 집중해서 진행 

회선 (convolution)

용어에 대한 명확한 정의 이후에 알고리즘에 대한 이해가 가능해 질 것이다. 영상 처리에서 '영역'에 대한 하나의 의미는 두개의 다른 범위(domain)의 구분이다. 공간 영역(spatial domain)이 하나고 다른 하나는 주파수 영역(frequency domain)이다. 여기서 공간 영역은 화소가 다루어지는 화소공간을 의미하는 것으로 x, y축의 2차원 공간을 말한다.  

 

영역에 대한 다른 의미로는 영역 기반 처리(area based processing)라는 표현에서 사용하는 영역이다. 화소점 하나에 대한 처리가 아니라 화소가 모인 영역의 배열을 의미한다. 이러한 이유에서 영역기반 처리를 규정된 영역 즉, 마스크 기반 처리라고도 한다 .  마스크 기반 처리는 마스크 내의 원소값과 공간 영역을 기반으로 연산이 수행된다. 마스크 기반 처리라고도 한다. 

 

마스크 기반 처리는 마스크 내의 원소값과 공간 영역에 있는 입력 영상의 화소값들을 대응되게 곱해 출력 화소를 구하는 것을 말한다. 이러한 처리를 모든 출력 화소에 대해서 필터를 거치면서 새롭게 화소값을 만드는 것을 회선(convolution)이라고 한다. 이때 입력 영상에 곱해지는 이 마스크는 커널, 윈도, 필터 등으로 불린다. 

 

블러링 blurring

마스크의 화소값이 급격히 변하지 않게 [[1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]]로 구성된 마스크를 이용하여 blurring을 진행한다. 이렇게 되면 출력 영상에서 이웃하는 화소들이 비슷하게 변해 점진적으로 변화하는 영상이 구성된다. 

샤프닝 sharpening

입력화소에서 이웃화소끼리 차이를 크게 되도록 출력화소를 만들어서 날카로운 느낌이 나게 만드는 것이다. 이러한 방법으로 경계 부분에서 명암 대비가 크게 하고 미세한 부분을 강조할 수 있다. 마스크의 중심위치의 계수인 중심 계수의 비중이 크게 하고 주위 계수와의 차이를 크게 하면 샤프닝이 발생한다. 필터를 샤프닝 필터로 진행하고 필터링을 진행하면 된다.

에지 검출 

윤곽선을 찾아내는 부분으로 화소값이 급격하게 변하는 부분으로 정의하는 것이 가능하다.화소값 그래프에서 급격하게 꺾이는 부분을 통해서 에지에 해당하는 화소들을 찾는다. 이웃하는 화소의 차분을 이용해서 그 차분이 특정 임계값 이상인 곳을 에지로 지정하는 것 역시 가능하다. 다른 방법으로는 마스크를 이용해서 2차 미분마스크를 통해 회선을 수행하는 것이 가능하다. 

 

1차 미분 마스크는 밝기의 변화율을 검출하는 방법을 밝기에 대한 기울기를 계산해서 이 기울기의 크기가 곧 에지가 되게 한다. 이때 수평방향과 수직방향으로 각각 편미분을 한 화소 단위로 진행하고 각 방향의 차분을 이용해 기울기 크기를 계산하면 이 크기(magnitude)가 에지의 강도이다. 

 

회선의 수식을 이용해서 화소간 차분을 계산할 수 있도록 마스크의 원소를 구성하면 1차 미분 마스크가 된다. 이 마스크를 적용해서 입력 영상에 회선을 수 행하면 에지 검출이 가능하다. 전체 밝기 값은 유지되어야 하므로 카스크 계수의 합은 0이 되어야 한다.

 

로버츠 마스크(Roberts)

대각선 방향으로 1과 -1을 배치해서 구성한다. 나머지 원소의 값이 모두 0이어서 다른 1차 미분 마스크에 비해 계산이 단순하다. 그리고 한번만 차분을 계산하기 때문에 차분의 크기가 작고 이로 인해 경계가 확실한 에지만 추출하고 잡음에 매우 민감하다. 

프리윗 마스크(Prewitt)

중심 계수에서 앞 뒤로 차분을 3번 계산하는 방식으로 수직 마스크와 수평 마스크의 크기에 대한 결과로 에지 강도를 생성하고 세번의 차분을 합해서 에지의 강도에 대해 값을 찾아낸다. 상대적으로 에지의 강도가 강하고 수평과 수직 에지를 동등하게 찾는다. 

소벨 마스크(Sobel)

에지 추출을 위한 대표적 1차 미분연산자. 마스크의 구성은 비슷하지만 중심 계수(중심기준 위아래 좌우) 의 비중을 2배로 키운 것이 특징이다. 중심계수의 차분을 높이는 방식을 통해서 대각선 방향의 에지도 잘 검출하는 것이 가능하다. 

2차 미분 마스크

1차 미분 연산자는 밝기가 급격하게 변하는 부분 뿐 아니라 점진적으로 변화하는 부분까지 민감하게 에지를 검출해 너무 많은 에지가 나타날 수 있다. 이를 보완하는 방법으로는 1차 미분에서 한번 더 미분하는 방법을 사용한다. 이를 통해 변화하는 영역의 중심에 위치한 에지만을 검출하고 밝기가 점진적으로 변화하는 반응을 보이지 않는다. 대표적인 방법으로는 라플라시안, LoG, DoG 등이 있다. 

라플라시안 에지 검출 

중심계수와 4방향 혹은 8방향의 주변화소와 차분을 합해 에지를 검출한다. 주변 화소에 잡음이 있으면 잡음에 민감해 실제보다 더 많은 에지를 검출하는 경향이 있다. 

LoG(Laplacian of Gaussian)와 DoG(Difference of Gaussian) 

잡음을 제거하고 라플라시안을 수행하는 방법으로는 잡음 제거해 주는 선형 공간 필터를 선택해 회선을 하고, 그 후에 라플라시안 마스크로 회선 하는 방법을 생각하는 것이 가능하다. 두 가지 모두 선형 필터링이기 때문에 다음과 같이 수식을 하나로 합쳐서 단일 마스크를 계산하는 것이 가능하다.  그러나 이러한 수식의 마스크 계수구성과 회선수행은 잡음에 강한 에지는 구성 가능하지만 마스크 계수범위가 작아지기 때문에 전체 계수의 합이 0에 가까워지도록 스케일 조정이 필요하다. 이러한 복잡한 과정에서 시간이 오래 걸리는 것을 보완해 단순하게 구현하는 알고리즘이 바로 DoG이다. 두 개의 표준 편차로 이용해서 가우시안 마스크를 만들고 그 차이가 DoG마스크가 된다. 이러한 표준편차의 값을 조절함으로써 검출할 에지의 넓이를 조절할 수 있다. 좀 더 쉽게 DoG를 구현하는 방법은 두 개의 표준편차로 가우시안 마스크를 생성해서 회선을 수행하고 그 결과 행렬들의 차분을 계산하는 것이다. 

케니 에지 검출 

4단계의 알고리즘으로 

1. 블러링을 통한 노이즈 제거 (가우시안 블러링)

2. 화소 기울기 강도와 방향 검출 (소벨 마스크)

3. 비최대치 억제(non-maximum suppression) - 현재화소가 이웃하는 화소보다 크면 에지로 보존 아니면 에지가 아닌것으로 간주해 제거

4. 이력 임계값으로 에지 결정 

화소의 기울기 검출에는 가로방향과 세로방향의 소벨 마스크로 회선을 적용하고 회선이 완료된 행렬 (Gx, Gy)를 이용해서 화소 기울기 크기와 방향을 계산한다. 그리고 기울기의 방향은 4개의 방향으로 근사하여 단순화한다. 케니 알고리즘은 이력 임계처리로 에지가 끊어지는 것을 방지하는데 임계값의 밖으로 값이 나가면 에지 추적을 시작한다. 이때 임계값보다 작은 다른 화소 에지에서 제외시킨다. - 에지의 연속성이 존재하게 만들어 주는 것으로 보면 되나..?

기타 필터링

최댓값/최솟값 필터링

입력영상의 중심화소에서 마스크로 씌워진 영역의 입력화소들을 가져와서 계수를 구성하고 그중에서 최댓값 혹은 최솟값을 출력 화소로 결정하는 방법으로 영상이 전반적으로 밝아지거나 어두워 지게 하는 것으로 각각 밝은 잡음과 어두운 잡음들이 나타나게 된다. 

평균값 필터링

전반적으로 영상이 흐려지는 현상이 나타난다. 

중앙값 필터링

평균값을 사용하지 않는 이유는 미디언(median)필터링 만의 잡음으로 인한 영향을 덜 받고 흐려지게 만드는 것이 가능하기 때문이다. (평균값에 잡음인 이상값이 끼게 되면 필터 자체에 큰 영향을 줄 수 있기 때문)  다만 정렬 알고리즘을 사용해야 하기 때문에 속도가 심하게 느려질 수 있다. 보통 명암도 영상에서 효과적으로 수행된다. 

가우시안 스무딩 필터링

영상을 회선을 통해 부드럽게 하는 기법이다. 마스크 전체 합이 1이되어야 영상의 밝기를 유지할 수 있다. 표준편차를 통해서 마스크 계수의 구성을 조정하는 것이 가능하다. 표준편차가 클수록 마스크가 더욱 흐려지게 만들고, 표준편차가 작아지면 중심화소의 비중이 커져 흐림의 빈도가 약해진다. OpenCV에서는 cv2.GaussianBlur를 시용해서 스무딩을 진행한다. 다른 방법으로는 마스크를 구현하고 이 마스크를 cv2.filter2D() 함수에 적용하는 방법도 가능하다.

모 폴로지(morphology)

형태학으로 쓰이는 모폴로지는 영상의 객체들의 형태를 분석하고 처리하는 기법이다. 이 형태학적 처리를 활용하여 영상의 경계, 골격, 블록등의 형태를 표현하는 데 필요한 요소를 추출한다. 간단히 말하면, 영상 내에 존재하는 객체의 형태를 조금씩 변형시켜 영상 내에서 불필요한 잡음을 제거하거나 객체를 뚜렷하게 해 필요한 요소를 추출한다. 

침식 erosion operation

객체를 침식시키는 연산으로 객체 크기는 축소되고 배경은 확장된다. 물체를 분리하는 데에도 유용하게 사용이 가능하다. 마스크의 원소와 입력영상의 화소가 완전히 일치해야 색을 출력하게 하는 방식으로 진행해 (마스크가 꽉 찬 곳만 존재하는 곳으로 인정) 여러 화소가 깎여 나가게 한다. 특히 돌출 부분이나 잡음은 완전하게 제거된다. cv2.morphologyEx() 방법으로 사용이 가능하다.

팽창 dilation operation

객체를 팽창시키는 연산이다. 객체의 가장 외곽 화소를 확장시키기 때문에 객체의 크기는 확대되고, 배경은 축소된다. 또한 객체의 팽창으로 인해 객체 내부에 있는 빈 공간도 메워지게 된다. 침식과 달리 마스크에 해당하는 값이 존재하면 값이 존재하는 것으로 인정해 주는 방식으로 확대된다. cv2.dilate()로 진행된다.

열림 연산과 닫힘 연산 

배경의 미세잡음을 침식을 통해서 제거한 다음 팽창연산을 통해 원래 크기로 만드는 방식이다. 다만 돌출 부분이 제거될 수 있다.