데이터분석/Vision Recognition

① 파이썬 - 컴퓨터 비전 프로그래밍 (Basic Image Handling and Processing) (2)

늘근이 2015. 10. 1. 22:37

중딩때 포샵질좀 해봤을만한 필터를 한번 적용시켜보자


필터에 대한 적용은 scipy.ndimage 에 있고, 참조 라이브러리는 다음과 같다.

http://docs.scipy.org/doc/scipy/reference/ndimage.html


- 가우시안 필터

시그마 값의 크기에 따라 흐려지는 필터가 적용되는게 다르다.


gaussian_filter.py

from PIL import Image
from numpy import *
from scipy.ndimage import filters

original = array(Image.open('image.PNG').convert('L'))
filtered = filters.gaussian_filter(original,5)

Image.fromarray(filtered).save("result.PNG")



- Sobel 필터

   

Sobel 필터를 단순 적용시켰을때의 이미지

filtered = filters.sobel(original,1) 



뭔지 잘 모르겠으니까 이제 한번 이미 합성을 시도해보자.


fusion.py

from PIL import Image
from numpy import *
from scipy.ndimage import filters

original = array(Image.open('image.PNG').convert('L'))

imageX = zeros(original.shape)
filters.sobel(original,1,imageX)

imageY = zeros(original.shape)
filters.sobel(original,0,imageY)

fusion = sqrt(imageX**2 + imageY**2)

Image.fromarray(imageX).convert('RGB').save("imageX.PNG")
Image.fromarray(imageY).convert('RGB').save("imageY.PNG")
Image.fromarray(fusion).convert('RGB').save("fusion.PNG")


imageX.png


imageY.png


fusion.png




-참조-

SVD(Singular Value Decomposition)

우리가 쉽게 이미지를 압축한다거나, 크기를 줄인다거나 할때 어떻게 그렇게 크게 줄어드는지 고민을 해본적이 있을까

결국 이미지도 보통은 이차원의 면을 생각해볼수있고, 여기에 (R,G,B)값이 적절히 이차원배열로 적절히 펼쳐져 있는 모습을 상상해 볼수 있다. 따라서 결국에는 이미지를 변형을 가하려면 뭔가 행렬값과 타협을 하면 된다.

SVD 를 통해 계산을 북적북적해서 뭔가를 변형하고 계산하게 된다.



전문적인 내용은 더 알고싶으면 진짜 잘아는 분께 가라.

http://darkpgmr.tistory.com/106

위키피디아(영문)도 계신다.

https://en.wikipedia.org/wiki/Singular_value_decomposition


PCA - Principal Component Analysis (주성분분석)


더 머리아파 보이지만 그냥 고차원의 데이터를 저차원의 데이터로 환원시켜 좀 쉽게 이용하는 듯하다. 사실 좀 나도 머리가 아프니 무슨소리인지 분석 가능하다면 다음의 위키백과를 참조한다.

https://ko.wikipedia.org/wiki/%EC%A3%BC%EC%84%B1%EB%B6%84_%EB%B6%84%EC%84%9D

벌써 (1)  번 포스팅에서 짚고 넘어갔다. Numpy라이브러리에서 제공하는 flatten() 메서드이다. 즉 다음과 같은 2차원 행렬을 변환하는 것 뿐이다.


\(
        \begin{pmatrix}
        1 & 2 & 3 \\
        4 & 5 & 6 \\
        4 & 3 & 4 \\
        \end{pmatrix}
\)


이런 행렬을 그냥 {1 2 3 4 5 6 4 3 4} 로 변환하는 메서드일뿐이다. 이렇게 행렬이 차원이 높으면 높을수록 직관적이지도 않고 머리가 아파올때 한줄로 쫙써놓고 뭔가를 해볼수가 있는것이다.


이미지크기와 같은 백지(0행렬) 를 하나 만들어내고 싶을때 (Numpy 1.9이상)

1) 이미지를 행렬로 하나 불러와서,

image_array = array(Image.open('image.PNG'))

2) 이미지 크기에 맞는 사이즈를 구한다.

s = image_array.shape

3) 그리고 사이즈에 맞게 0행렬을 구한다.

result = zeros(s)

 

이미지를 저장하는 다른 방법.

그동안은 PIL 에 들어있던 fromarray메서드를 썼지만 상당히 귀찮다.

scipy.misc 안에 있는 imsave('aa.jpg',image) 이러한식으로 이용하면 된다.


그밖에..

노이즈를 줄이는법.


http://www.slideshare.net/madvirus/pca-svd