2014년 12월 30일 화요일

scikit-learn 설치

현재 설치 프로그램
- Python 2.7.8
- Numpy 1.9.1
- Scipy 0.12.0


설치 프로그램

위의 링크를 클릭하여 프로그램을 받는다.


1. 환경변수 설정


고급 시스템 설정 클릭




환경변수 클릭


Path의 편집을 눌려서 파이썬을 설치한 폴더를 추가해준다.

C:\Python27





* 환경변수를 설정하고 재프팅을 해주어야 적용된다.


2. ez_setup 설치

 윈도우키 + R



cmd창에서 위에서 압축을 푼 폴더로 이동하고
python ez_setup.py build 입력한다.



python ez_setup.py install 입력한다.



3. path 추가

아까 환경변수를 추가한 것처럼 아래 변수를 추가한다.
C:\Python27\Scripts


* 환경변수를 설정하고 재프팅을 해주어야 적용된다.


4. pip 설치

cmd창에 easy_install pip 입력한다.


5. scikit-learn 설치

cmd창에 pip install -U scikit-learn 을 입력한다.


6. 예제 파일
scikit-learn 실행 예제

print(__doc__)

from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE
import matplotlib.pyplot as plt

# Load the digits dataset
digits = load_digits()
X = digits.images.reshape((len(digits.images), -1))
y = digits.target

# Create the RFE object and rank each pixel
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)
ranking = rfe.ranking_.reshape(digits.images[0].shape)

# Plot pixel ranking
plt.matshow(ranking)
plt.colorbar()
plt.title("Ranking of pixels with RFE")
plt.show()

결과 화면



2014년 12월 17일 수요일

미워요


사랑 그 놈


사랑


아버지


My way


가로수 그늘 아래 서면


Soldier Of Fortune


Shape of my heart


Desperado


notre dame de paris

Circel detection (hough transform)


허프변환을 이용하여 circle을 찾는다. 라플라시안 엣지를 추출하여 픽셀마다 원을 그려준다. 원 가장자리 픽셀마다 원을 그려주게되면 원끼리 겹친다. 이때 픽셀의 밝기를 +1씩 증가시켜주면 가장 밝은 곳이 원의 중심이 된다. 물론 중심을 찾기위해서는 원의 반지름을 적절하게 넣어주어야 한다.


cos%5Ccombi%20%7B%20%5Ctheta%20%20%7D%3D%5Cfrac%20%7B%20x%20%7D%7B%20r%20%7D%3D%3Ex%3Dr*cos%5Ccombi%20%7B%20%5Ctheta%20%20%7D%20
sin%5Ccombi%20%7B%20%5Ctheta%20%20%7D%3D%5Cfrac%20%7B%20y%20%7D%7B%20r%20%7D%3D%3Ey%3Dr*sin%5Ccombi%20%7B%20%5Ctheta%20%20%7D%20
위의 식을 이용하여 픽셀마다 원을 그려준다. x좌표에 i, y좌표에 j를 더해주었는데 이는 좌표의 시작점을 가리킨다.



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <math.h>
 
void main()
{
 
    // Create other image plane
    IplImage* image = cvLoadImage("circle.jpg",1);
    int i, j, k, wi, hi, rwsize;
    wi = image->width;
    hi = image->height;
    rwsize = image->widthStep;
    IplImage* edgeimage = cvCreateImage(cvSize( wi, hi ), IPL_DEPTH_8U, 3);
    IplImage* tempimage = cvCreateImage(cvSize( wi, hi ), IPL_DEPTH_8U, 3);
    for(i=0; i<hi; ++i)
        for(j=0; j<wi; ++j)
            for(k=0; k<3; ++k)
                edgeimage->imageData[i*rwsize+j*3+k] = tempimage->imageData[i*rwsize+j*3+k] = 0;
 
 
    // Graysclae
    for(i=0; i<hi; ++i)
        for(j=0; j<wi; ++j)
            image->imageData[i*rwsize+j*3+2] = (unsigned char)(((int)image->imageData[i*rwsize+j*3+2]+(int)image->imageData[i*rwsize+j*3+1]+(int)image->imageData[i*rwsize+j*3+0])/3);
 
    // cvShowImage( "image",image );  
 
 
    ////라플라시안 edge 
    //int laplacianMask[3][3] = {-1,-1,-1,-1,8,-1,-1,-1,-1};
    //int THD = 0;
    //int edge;
    //for(int i=1;i<hi-1;i++){
    // for(int j=1;j<wi-1;j++){
    //  edge = 0;   
    //  for(int x=-1;x<2;x++){
    //   for(int y=-1;y<2;y++){
    //    edge += image->imageData[(i+x)*rwsize+(j+y)*3]*laplacianMask[x+1][y+1];
    //   }
    //  }
    //  //edge 값이 threshold 보다 크면 edgeimage에 그려줌
    //  if(edge > THD)
    //   edgeimage->imageData[i*rwsize+j*3+0] =edgeimage->imageData[i*rwsize+j*3+1] =edgeimage->imageData[i*rwsize+j*3+2] = 255;
    // }
 
    //}
    cvLaplace(image, edgeimage, 3);
 
    // cvShowImage( "edge", edgeimage );  
 
    // Draw Circle to Hough Plane
    double r = 135;
    double angle = 0;
    int count = 0;
 
    for(i=1; i<hi-1; ++i)
        for(j=1; j<wi-1; ++j)
            if (edgeimage->imageData[i*rwsize+j*3] != 0) //흰색이라면
            {
                angle = 0; //각도 초기화
                while(angle<360) //한바퀴
                {
                    int x = r * cos((double)angle) + i; //여기서 i, j는 시작지점을 말한다.
                    int y = r * sin((double)angle) + j;
                    if (x>=0 && x<hi && y>=0 && y<wi) //그림 크기 안에서
                        tempimage->imageData[x*rwsize+y*3+0] = tempimage->imageData[x*rwsize+y*3+1] = tempimage->imageData[x*rwsize+y*3+2] = 255;
                    angle = angle + 0.1;
                }
 
                for(int ti=0; ti<hi; ++ti)
                    for(int tj=0; tj<wi; ++tj)
                    {
                        if(tempimage->imageData[ti*rwsize+tj*3] != 0) //검은색이 아닌 어떤 픽셀이 존재한다면
                            for(int tk=0; tk<3; ++tk)
                                image->imageData[ti*rwsize+tj*3+tk]++; //grayscale된 이미지의 r,g,b값을 각각 증가시킴
 
                        tempimage->imageData[ti*rwsize+tj*3] = 0; //r,g,b에서 b값만 0이되고 나머지는 255이므로 노란색이 나옴
                        //위의 if문에서 중복하여 읽지 않도록 0으로 초기화한다
                    }
 
            }
 
            // cvShowImage( "exchangedimage", image );  
 
            //Find Maximum Point
            int mx = 0;
            int centeri, centerj;
            centeri = centerj = 0;
 
            for(i=1; i<hi-1; ++i)
                for(j=1; j<wi-1; ++j)
                {
                    if (mx < (image->imageData[i*rwsize+j*3+2]+image->imageData[i*rwsize+j*3+1]+image->imageData[i*rwsize+j*3+0])/3)
                    {
                        mx = (image->imageData[i*rwsize+j*3+2]+image->imageData[i*rwsize+j*3+1]+image->imageData[i*rwsize+j*3+0])/3;
                        centeri = i;
                        centerj = j;
                    }
                }
 
                // Draw Result Circle
                printf("%d",mx);
                cvCircle(image, cvPoint(centerj,centeri), (int)r, cvScalar(0,0,255));
                cvCircle(image, cvPoint(centerj,centeri), (int)1, cvScalar(0,0,255));
 
                cvShowImage("finalimage", image);
 
                cvWaitKey(0);                   
}

Morpology

Erosion(침식) : 검은색 픽셀을 확장시켜주어 흰색을 침식한다. 물체끼리의 구분에 유용
Dilation(확장) : 흰색 픽셀을 확장시켜 검은색을 침식한다. 물체를 명확하게 만듬

결과에서 보면 확장을 2번하였을 경우 물체가 흰색으로 물들며 물체가 선명해지는 것을 볼 수 있고, 
침식을 2번하였을 경우 물체사이의 검은색 픽셀이 확장되며 물체가 구분되는 것을 볼 수 있다.

검은색을 늘린 후 (침식) 흰색을 늘리면 (확장) opening 연산(독립영역 찾기)이라 하고 반대의 경우 closing 연산(잡음 제거)이라 한다. 여기서 결과는 closing 연산이다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <opencv\cv.h>
#include <opencv\highgui.h>
 
void main()
{
 
    IplImage* image = 0;                          // image 선언
    image = cvLoadImage("coins.jpg", 1);     //img.jpg파일을 불러옴 1은 컬러로 받아옴, 0은 흑백으로 받아옴(rgb가 없음)
    int imageRatio = 1;
 
    CvSize size = cvSize(image->width*imageRatio, image->height*imageRatio);
 
    IplImage *tmpImg = cvCreateImage(size,IPL_DEPTH_8U,3);
 
    IplImage *tmpImg2 = cvCreateImage(size,IPL_DEPTH_8U,3);
 
 
    int width = image->width;
    int height = image->height;
    int index = image->widthStep;
    int avg;
    int thd = 120;
    for(int i=0; i<height;i++){
        for(int j=0; j<width; j++){
            //gray scale
            int index2 = i*image->widthStep + j*3;
            avg = ((unsigned char)image->imageData[index2+0]+(unsigned char)image->imageData[index2+1]+(unsigned char)image->imageData[index2+2])/3;
            //이진화
            if(avg > thd) avg = 255;
            else avg = 0;
            for(int k=0;k<3;k++)
                image->imageData[i*index+j*3+k] = avg;
 
        }
    }
 
 
    //생성된 이미지를 검은색으로 만듬
    for(int i=0;i<tmpImg->height;i++)
        for(int j=0;j<tmpImg->width;j++)
            for(int k=0;k<3;k++)
            {
                tmpImg->imageData[i*tmpImg->widthStep+j*3+k] = image->imageData[i*index+j*3+k];
            }
 
 
            //원본이미지
            cvShowImage( "original", image );  
 
 
            //Dilation(팽창)
            for(int i=1;i<height-1;i++)
                for(int j=1;j<width-1;j++){
                    if((unsigned char)image->imageData[i*index+j*3] == 255){
                        for(int ii=-1;ii<2;ii++)
                            for(int jj=-1;jj<2;jj++)
                            {
                                tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+0] = 255;
                                tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+1] = 255;
                                tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+2] = 255;
                            }
                    }
 
                }
 
                cvShowImage( "Dilation1", tmpImg );  
 
                //Dilation
                for(int i=1;i<height-1;i++)
                    for(int j=1;j<width-1;j++){
                        if((unsigned char)tmpImg->imageData[i*index+j*3] == 255){
                            for(int ii=-1;ii<2;ii++)
                                for(int jj=-1;jj<2;jj++)
                                {
                                    image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+0] = 255;
                                    image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+1] = 255;
                                    image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+2] = 255;
                                }
                        }
 
                    }
 
                    cvShowImage( "Dilation2", image );  
 
 
                    //Erosion(침식)
                    for(int i=1;i<height-1;i++)
                        for(int j=1;j<width-1;j++){
                            if((unsigned char)image->imageData[i*index+j*3] == 0){
                                for(int ii=-1;ii<2;ii++)
                                    for(int jj=-1;jj<2;jj++)
                                    {
                                        tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+0] = 0;
                                        tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+1] = 0;
                                        tmpImg->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+2] = 0;
                                    }
                            }
 
                        }
                        cvShowImage( "Erosion1", tmpImg );  
 
                        //Erosion(침식)
                        for(int i=1;i<height-1;i++)
                            for(int j=1;j<width-1;j++){
                                if((unsigned char)tmpImg->imageData[i*index+j*3] == 0){
                                    for(int ii=-1;ii<2;ii++)
                                        for(int jj=-1;jj<2;jj++)
                                        {
                                            image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+0] = 0;
                                            image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+1] = 0;
                                            image->imageData[(i+ii)*tmpImg->widthStep+(j+jj)*3+2] = 0;
                                        }
                                }
 
                            }
                            cvShowImage( "Erosion2", image );  
 
 
 
 
 
 
 
 
 
 
                            cvSaveImage("out.jpg",image);
                            cvSaveImage("edge.jpg",tmpImg);
 
                            cvWaitKey(0);                    // 사용자의 키 입력을 기다림
 
 
}


결과