영상처리
[영상처리] 공간적 필터링 기법
study111
2023. 6. 9. 21:34
1. 영상 날카롭게 만들기
- 필터링을 이용한 영상을 날카롭게 만드는 효과
- 샤프닝(sharpening)
- 크리스프닝(crispening)
- 영상을 날카롭게 만든다? 영상 내의 엣지 부분을 강조하여 영상을 더욱 선명한 느낌으로 만들어주는 영상처리 기법
언샤프 마스크(Unsharp mask) 필터링
- 날카롭지 않은(unsharp) 영상, 즉, 부드러워진 영상을 이용
(원본 영상)-(부드러운 영상=언샤프 영상) =(날카로운 영상=고주파 영상=엣지 강조된 영상)
(원본 영상보다 엣지 강조된 영상) = (원본영상)+(날카로운 영상)
언샤프 마스크 필터링 시뮬레이션
라플라시안 필터를 이용한 언샤프 마스크 필터
- 부드러워진 영상 대신 영상의 이차 미분을 이용
- 라플라시안(Laplacian) 필터 = 영상의 이차 미분을 이용한 마스크
- 영상의 x 방향으로의 이차 미분
실제 영상에 라플라시안 필터를 적용한 결과
- 입력 영상, 4방향, 8방향을 고려한 라플라시안 필터링 결과
- 언샤프 마스크를 대체할 수 있을만한 엣지 강조된 필터 나옴
라플라시안 필터를 이용한 언샤프 마스크 필터 수식
- 기존에 사용했던 언샤프 마스크 필터는 뺏셈 연산이라 잘 사용하지 x
- (원본 영상)-(라플라시안 필터) = (엣지 강조된 영상)
- 즉, 라플라시안 필터가 첫번째 방법이었던 언샤프 마스크 대신에 들어가는 셈이다. 마이너스 하니깐 !!
하이부스트(High-boost filter) 필터
- 입력 영상의 명암비를 전체적으로 높여줌과 동시에 엣지를 강조 → 전체적으로 더욱 선명한 느낌이 드는 결과 생성
- a는 1보다 같거나 큰 실수를 사용
- 마스크에는 가운데 가중치에 양의 실수를 더하는 것으로 구현할 수 있음
- 위에 정의한 라플라시안 필터를 이용한 언샤프 마스크 필터링하고 유사한데 원본 영상에 명암 상수를 붙여줘서 명암비도 높여줌 !!
[실습] 영상 날카롭게 만들기
2. 잡음 생성
영상의 잡음(Noise)
- 영상의 픽셀 값에 추가되는 원치 않는 형태의 신호
가우시안 잡음
- 가우시안 분포 함수 형태를 따르는 잡음
- 예를 들어, 카메라에서 광학 신호를 전기적 신호로 변환하는 센서에 가우시안 잡음이 추가될 수 있음
- 평균값 필터 등 스무딩으로 효과를 감쇠시킬 수 있음
정상 분포(normal distribution)
- 평균이 0이고, 표준편차가 1인 가우시안 분포(Gaussian distribution)
- 정상 분포 난수 10개 발생시키기 코드
- generator 객체는 distribution 객체에게 난수를 발생시키도록 요청하고, distribution은 해당 가우시안 분포에 따른 난수 값을 생성하여 반환합니다. 그런 다음 std::cout을 사용하여 생성된 난수 값을 출력합니다.
- generator 객체는 실제로 난수 값을 생성하는 것이 아니라, distribution 객체에게 난수 생성을 위임하고 생성된 값을 반환합니다.
//default_random_engine 클래스의 객체 generator를 생성
//이는 기본적인 난수 생성기로 사용되며, 기본 시드를 사용하여 초기화
std::default_random_engine generator;
//normal_distribution 클래스의 객체 distribution을 생성
//평균이 0이고 표준편차가 1인 정규 분포
std::normal_distribution<double> distribution(0.0, 1.0);
//반복문을 사용하여 10번 반복. i 변수는 반복 횟수
for (int i = 0; i < 10; i++)
std::cout << distribution(generator) << std::endl;
//distribution 객체를 호출하여 generator를 이용해 난수 생성
//평균이 0이고 표준편차가 1인 가우시안(정규) 분포를 따르는 난수를 10개 생성하고 출력하는 코드
- 시드 값 부여하여 매번 다른 난수 발생시키기
//현재 시간을 기반으로 난수 발생기의 시드 값 생성
unsigned int seed = static_cast<unsigned int>(time(NULL));
//랜덤한 seed 값을 바탕으로 난수 생성기인 generator 초기화
std::default_random_engine generator(seed);
//가우시안 분포 따르는 객체 생성
std::normal_distribution<double> distribution(0.0, 1.0);
//출력
std::cout<<distribution(generator)<<std::endl;
소금&후추(Salt&Pepper) 잡음
- 입력 영상의 픽셀 값을 0 또는 255로 만드는 형태의 잡음
- 카메라 센서 자체의 에러, 광학 신호를 전기적 신호로 변환하는 과정에서의 에러
소금&후추 잡음 구현 방법
- 균일 분포 난수로 픽셀 좌표를 선택하여 0 또는 255로 설정
unsigned int seed = static_cast<unsigned int>(time(0));
std::default_random_engine generator(seed); //랜덤한 난수 생성기 만들기
//소금&후추 잡음을 추가할 픽셀 위치 구하기
//0~100 사이에 잡음이 생성될 가능성이 동일함
std::uniform_int_distribution<int> distribution(0, 100);
for (int i = 0; i < 10; i+ +)
std::cout << distribution(generator) << std::endl;
3. 잡음 제거를 위한 비선형 필터
미디언(Median) 필터
- 주변 픽셀들의 값들을 오름 또는 내림 차순으로 정렬하여 그 중앙에 있는 값으로 픽셀 값을 대체하는 방식의 필터
비등방성 확산(Anisotropic diffusion) 필터
- 엣지 보전(Edge-preserving) 잡음 제거 필터의 하나
- 비등방성: 각 방향의 필터링 정도가 다름
- 비등방성 확산 수식을 이산 함수 형태로 변환