일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바
- 상속
- 혼공머신
- JDBC
- JSP/Servlet
- ChatGPT
- 컴퓨터구조
- 중학수학
- 파이썬
- 데이터분석
- 정보처리기사필기
- JSP
- 쇼핑몰홈페이지제작
- 정보처리기사실기
- 머신러닝
- 자바스크립트
- 중학1-1
- 연습문제
- 컴퓨터비전
- 디버깅
- 순환신경망
- html/css
- 자바스크립트심화
- 자바 실습
- 타입스크립트심화
- 데이터베이스
- 개발일기
- SQL
- 딥러닝
- rnn
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
영상 처리 4 - 영역 연산 본문
조금 지루한 부분이 많지만 그래도 공부를 이어가 볼 것이다. 영역 연산은 이웃 화소를 같이 고려해 새로운 값을 결정한다. 영역 연산은 주로 컨볼루션을 통해 이루어진다.
컨볼루션
컨볼루션은 입력 영상 f의 각 화소에 필터를 적용해 곱의 합을 구하는 연산이다. 아래 그림의 a는 1차원 영상을 1차원 필터 u로 컨볼루션 한 예다. 곱의 합은 해당하는 화소끼리 곱한 다음 결과를 더한다.
필터를 가장자리 화소에 씌우면 필터의 일부가 밖으로 나가기 때문에 적용할 수 없다. 컨볼루션은 연산 도중에 발생하는 값을 입력 영상 f 자체에 기록하는 제자리 연산으로 구현할 수 없다.
다양한 필터
컨볼루션 자체는 특정한 목적이 없는 일반 연산이다. 필터가 정해지면 목적인 결정된다. 영상은 다양한 잡음이 있다. 밝은 영역에 어두운 작은 반점이 여기저기 나타나는 경우 잡음일 가능성이 높다. 이런 경우 그림 a에 있는 스무딩 필터로 컨볼루션하면 잡음을 누그러뜨릴 수 있다.
어떤 점의 값이 주위에 비해 아주 낮을 때 자신은 커지고 주위는 작아져서 잡음을 누그러뜨리는 효과를 발휘한다.
스무딩 필터는 잡음을 제거하는 효과가 있지만 부작용으로 물체의 경계를 흐릿하게 만드는 블러링이라는 부작용이 있다. 그림 b는 스무딩 필터와 반대 작용을 하는 샤프닝 필터다. 서프닝 필터는 에지를 선명하게 해서 물체의 식별을 돕는 작용을 하는데 부작용으로 잡음을 확대한다. 필터를 잘 설계하면 흥미로운 효과를 얻을 수 있다.
그림 c는 물체에 돋을새김 느낌을 주는 엠보싱이다.
데이터 형과 컨볼루션
대부분의 OpenCV함수는 연산 결과가 변수의 유효한 값의 범위를 벗어나지 않게 주의를 기울여 작성되어 있지만 컨볼루션을 지원하는 filter2D 함수와 같이 프로그래머가 주의를 기울여야 하는 경우가 있다.
데이터 형
OpenCV는 주로 한 화소의 명암 단계를 0~255 범위로 표현하며 이를 위해 1바이트를 사용한다. 다음 프로그램을 실행한 후 img를 구성하는 화소의 데이터 형을 확인하면 numpy.uint8이다. uint8은 unsigned interger 8 bits의 약어로서 0~255 범위를 표현할 수 있는 부호 없는 8비트 데이터형이다.
이 필터는 오른쪽 아래 화소에서 왼쪽 위 화소를 빼는 연산이므로 -255~255 범위의 값이 발생할 수 있다. 따라서 컨볼루션 결과를 그냥 저장하면 문제가 생긴다. uint8형의 변수가 범위를 벗어난 값을 어떻게 저장하는지 다음 명령어로 확인해 보자. 정상 범위인 0, 1, 254, 255는 그대로 유지되는데, -3, -2, -1은 253, 254, 255로 바뀌었고 256, 257, 258은 0, 1, 2로 바뀌었다.
원래는 안 되는데 이렇게 변환되었다는 내용같다. 이 코드를 실행하는데 무척 애를 먹었다. 스펠링을 자꾸 틀리는 바람에 오류가 난 거였다.
그림 c의 왼쪽 엠보싱 필터에 대해 생각해보자. 이 필터는 -255~255 사이의 값을 출력할 수 있는데 어떻게 해어 0~255 범위를 사용하면서 엠보싱 효과를 얻을 수 있을까? 128을 더해 -255~255 범위를 -127~383 범위로 변환한 후 np.clip 함수로 0~255 범위로 축소한다.
컨볼루션 적용
다음 프로그램을 통해 앞에서 배운 여러 가지 필터를 실험해 보자. 5~9행은 영상을 읽어와 축소하고 명암 영상으로 변환해 gray 객체에 저장한다. 10행은 스무딩 효과를 살펴보기 위해 영상에 글씨를 써넣는다.
28과 32행을 잘 살펴볼 필요가 있다. 엠보싱 필터는 오른쪽 아래 화소에서 왼쪽 화소를 빼기 때문에 음수가 발생한다. 그런데 gray 배열의 화소는 np.uint8형이다. 즉 부호가 없는 1바이트 정수 형이다. 19행의 filter2D 함수는 주어진 영상 배열과 같은 형의 배열을 출력하기 때문에 결과 영상도 uint8형이다. 따라서 음수가 발생하면 이상한 값으로 바뀌어 저장된다.
28행은 음수를 표현하기 위해 gray 배열에 np.int16 함수를 적용해 부호가 있는 2바이트 형으로 변환한다. 이제 실행한 결과를 분석해보자.
먼저 5 x 5, 9 x 9, 15 x 15 크기의 가우시안 필터로 스무딩한 영상을 보면 필터가 커질수록 영상의 세부 내용이 사라지는 현상을 확인할 수 있다. 15 x 15의 경우 'soccor'라는 글씨를 식별할 수 없을 정도가 되었다.
엠보싱을 적용한 영상을 살펴보자. np.int16과 np.clip을 적용한 경우 보기 좋은 엠보싱 영상이 되었다. np.int16을 적용하지 않은 마지막 엠보싱 영상은 엠보싱으로 보기 어려울 정도로 품질이 떨어진다.
학습을 마치고
오늘 새벽에 이 공부를 하다가 내용이 얼마나 어렵던지 컴퓨터 비전을 공부할 수 있는 다른 책을 알아보기도 하고 과연 이 공부를 끝까지 하는 것이 좋을지 많은 고민이 되었다. 하지만 다른 책도 별다르지 않았고 출판된 지 5년 이상 된 책도 있었고 설명은 이 책만큼 못하는 것 같았다.
어렵더라도 끝까지 포기하지 않고 가기로 했다. 많이 이해하지 못해도 괜찮다. 원래 컴퓨터 비전이 어려운 분야라고 한다.
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
영상 처리 6 - 연습문제 풀기 1 : 문제 1~3번 (0) | 2024.11.09 |
---|---|
영상 처리 5 - 기하 연산과 OpenCV의 시간 효율 (0) | 2024.11.09 |
영상 처리 3 - 점 연산 (0) | 2024.11.09 |
영상 처리 2 - 이진 영상 (0) | 2024.11.08 |
영상 처리 1 - 디지털 영상 기초 (0) | 2024.11.08 |