C로 컴퓨터비전 구현해보기(1)

bolim·2023년 3월 17일
0

컴퓨터비전

목록 보기
1/1

한동안 교환학생을 갔다온다고 블로그 업로드를 미뤘는데...
다시 시작해보려한다. 한동안은 교환가서 배운 내용들을 정리겸 올릴 계획이다.
교환 가서 들은 수업들이 석사수업들이라 쉬운 내용이 없어 차근차근 다시 공부하며 올릴 예정이다.

가장 먼저는 C언어로 작성한 이미지 프로세싱 프로그램이다.

프랑스는
다들 리눅스를 사용하고
학교의 모든 컴퓨터도 리눅스다.

심지어 과제도 리눅스로 컴파일 하도록 한다...

리눅스를 못하지는 않아
어려움은 없었는데
불편하긴 했다ㅎㅎㅎ

이참에 리눅스와 친해져왔다.

Local Filtering

사실 가장 먼저 한 것은
C로 PGM 파일 읽고 쓰는 것이었다.

하지만 이 부분은 따로 파일이 안남아있어
다음 과제들에 삽입되어있는 코드 참고하기를 부탁드린다.

영상에 Local filtering을 이용하여 해당 픽셀 값을 이웃 픽셀들을 고려한 값들로 대체하여 Smoothing, 즉 noise를 없애는 효과를 낼 수 있다.

Local Filtering에는
3가지 방법이 있다.

1) Averaging
2) Median Filter
3) Bilateral Filter

Averaging

말 그대로 평균값을 이용한 방법이다.

I(i,j)=(m,n)Nh(m,n)I(im,jn)I'(i,j) = \sum_{(m,n)\in N}h(m,n)I(i-m,j-n)
(m,n)Nh(m,n)=1\sum_{(m,n)\in N}h(m,n)=1

이 방법에는
Binomial filter 방식도 포함되어있다.

Binomial filter는 가우시안 필터의 이산분포와 유사하며 가우시안 노이즈와 잘 맞다.

Binomial filter는 파스칼의 삼각형으로 coefficient values를 구할 수 있다.

ex)

1/16[121242121]1/16 \begin{bmatrix}1&2&1\\2&4&2\\1&2&1\end{bmatrix}

출처:타이완의 Shang Shou, Communication and Multimedia

Median Filter

위의 averaging 방식은 이미지의 노이즈도 없애지만 정보도 많이 없어진다.

그래서 평균을 취하지 않고 이웃 픽셀 중 최빈값으로 대체하는 방식도 있다.

Bilateral Filter

이 방식은 1998년 Tomasi와 Manduchi에 의해 소개되었다.

비선형 가우시안 필터를 사용하여 이전 방식들 보다
노이즈를 제거해주면서도 엣지를 잘 유지한다.

비선형 가우시안 필터는 센터픽셀과의 유사성을 고려하면서 가중치를 부여하여 엣지가 더 잘 유지된다.


이 이미지는 소개되었을 당시 논문에 실려있던 이미지이다.

I(i,j)=(m,n)Nh(m,n)I(im,jn)I'(i,j) = \sum_{(m,n)\in N}h(m,n)I(i-m,j-n)
(m,n)Nh(m,n)=1\sum_{(m,n)\in N}h(m,n)=1

여기에
k,lk,l 2개의 가우시아 커널들이 사용된
bilateral filter 은 아래 식과 같이 계산된다.

h(m,n)=1ck(m2+n2) l((I(i,j)I(im,jn))2h(m,n) = \frac 1ck(\sqrt{m^2 + n^2})\space l(\sqrt{(I(i,j) - I(i-m,j-n))^2}
c=(m,n)Nk(m2+n2) l((I(i,j)I(im,jn))2c = \sum_{(m,n)\in N}k(\sqrt{m^2 + n^2})\space l(\sqrt{(I(i,j) - I(i-m,j-n))^2}

커널 ll은 중심픽셀과 다른 값의 영향을 줄여준다.

C로 구현한 코드로 직접 얻은 결과이다. - Github 링크

profile
나는야 호기심 많은 느림보🤖

0개의 댓글