반응형

OpenCV는 빠르고 사용하기 쉬운 영상의 모폴로지 변환을 제공한다기본적인 모톨로지 연산은 팽창과 침식이다이들 기법은 영상 내에서 잡음 제거또는 구성 요소들의 결합 또는 분리 등의 폭넓은 분야에서 널리 사용된다모폴로지는 밝기값이 뭉쳐있는 영역이나 영상의 그래디언트를 구하는 용도로도 사용될 수 있다.

 

팽창과 침식
팽창연산도 영상과 커널과의 컨볼루션이다이때 영상을 A라고 하고커널을 B라고 하면 커널은 임의의 모양과 크기를 가질 수 있고고정점을 하나 갖는다대부분의 경우 커널은 중앙에 고정점을 가지고 있는 작은 정사각형 또는 원형으로 구성된다커널은 템플릿 또는 마스크의 일종이라고 생각할 수 있으며 팽창 연산은 국지적 최대값을 선택하는 효과가 있다영상 A를 커널 B로 스캔하면서 B와 겹치는 영역에서 최대 픽셀값을 구하고이 값을 고정점 아래에 있는 픽셀의 값으로 설정한다.


 

참조 :한빛미디어 Learining OpenCV 제대로 배우기

 

침식은 팽창과 반대되는 개념이다침식 연산은 커널 아래에서 국지적 최소값을 계산하는 것과 유사하다침식 연산 알고리즘은 영상 A를 커널 B로 스캔하면 B와 겹치는 영역에서 최소 픽셀값을 구하고이 값을 고정점 아래에 있는 픽셀의 값으로 설정한다.


영상 모톨로지는 임계값 연산 후 얻어지는 이진 영상에 대해서도 자주 실행된다그러나 팽창은 단지 최대값 연산이고 침식은 단지 최소값 연산이기 때문에 모폴로지는 일반 영상에서도 사용될 수 있다.

 

일반적으로 팽창은 영역 A를 확장시키는 반면침식은 영역 A를 축소시킨다또한 팽창은 영역 A에서 오목하게 들어간 부분을 채우는 효과가 있고침식은 볼록 튀어나온 부분을 제거하는 효과가 있다물론 이러한 결과는 커널의 모양에 따라 달라지기는 하지만 속이 꽉 채워져 있는 컨백스 형태의 커널이 사용될 경우에는 일반적으로 참이다. OpenCV에서는 침식을 위한 cvErode()와 팽창을 위한 cvDilate() 함수를 제공한다.

 

public static void Erode(CvArr src, CvArr dst, IplConvKernel element, int iterations);

 

public static void Dilate(CvArr src, CvArr dst, IplConvKernel element, int iterations);

 

cvErode()  cvDilate() 함수는 입력과 출력 영상을 인자로 받으며 바꿔치기 호출을 지원한다입력과 출력 영상을 동일한 영상으로 지정할 수 있다세번쨰 인자 B에는 커널을 전달할 수 있으며기본값으로 null이 설정된다커널이 null이면 중앙에 고정점이 있는 3x3 크기의 커널이 자동으로 사용된다마지막 인자 iterations에는 반복 횟수를 지정한다만약 iterations가 기본값 1이 아니면 함수 내부에서 해당 연산을 여러 번 반복하게 된다.


침식 또는 최소값 연산의 결과밝은 영역은 고립되거나 줄어든다.

Cv.Erode(src, dst,null,3);

 

침식연산은 영상에서 얼룩 잡음을 제거하기 위해 종종 사용되곤 한다얼룩은 침식으로 인해 없어지고중요한 큰 영역들은 영향을 받지 않고 그대로 남아있게 된다팽창 연산은 종종 연결된 구성 요소를 찾고자 할 때 사용된다잡음그림자 등 다양한 이유로 인하여 하나의 큰 영역이 여러 개의 구성 요소로 분리되는 경우가 발생하기 때문에 팽창 연산은 종종 필요하다.

 


팽창 또는 최대값 연산의 결과밝은 영역은 확장되어 합쳐지기도 한다.

 

반응형

'Programing > OpenCV' 카테고리의 다른 글

Opencv C# 모폴로지  (0) 2016.11.30
영상 모폴로지 자체 커널 만들기  (0) 2016.11.30
스무딩(블러링)  (0) 2016.11.30
영상 파일 포맷의 종류  (0) 2016.11.30
영상처리 컬러모델  (0) 2016.11.30
반응형

스무딩 또는 블러링은 매우 간단하면서도 빈번하게 사용되는 영상처리 기법이다스무딩 기법은 주로 영상의 잡음(noise) 또는 손상을 완화시키기 위해서 사용된다스무딩은 영상의 크기를 줄이는 경우에도 중요한 역할을 담당한다. OpenCV는 현재 다섯 가지 스무딩 방법을 제공한다모든 스무딩 연산은 하나의 함수 cvSmooth()에 구현되어 있으며함수의 인자에 의해 연산 방법이 결정된다.

 

        public static void Smooth(CvArr src, CvArr dst);

 

        public static void Smooth(CvArr src, CvArr dst, SmoothType smoothtype);

 

        public static void Smooth(CvArr src, CvArr dst, SmoothType smoothtype, int param1);

      

        public static void Smooth(CvArr src, CvArr dst, SmoothType smoothtype, int param1, int param2);

 

        public static void Smooth(CvArr src, CvArr dst, SmoothType smoothtype, int param1, int param2, double param3);

 

        public static void Smooth(CvArr src, CvArr dst, SmoothType smoothtype, int param1, int param2, double param3, double param4);

 

Src dst는 각각 입력 영상과 출력 영상을 가리킨다. cvSmooth() 함수는 param1, param2, param3, param4 라는 평이한 이름의 매개변수 네 개를 갖는데이들 매개변수의 의미는 세 번째 인자 smoothtype에 의해 결정된다.

Smoothtype 

이름

바꿔치기

채널개수

입력영상타입

출력영상타입

설명

CV_BLUR

단술 

블러

O

1,3

8u,32f

8u,32f

Param1 x param2 크기의 이웃 필셀값의 평균

CV_BLUR_NO_SCALE

스케일링 없는 

단순 

블러

X

1

8u

입력이 8u이면 16s 32f 이면 32f

Param1 x param2 크기의 이웃 픽셁밧의 합

CV_MEDIAN

중간값 블러

X

1,3

8u

8u

Param1 x param2 크기의 이웃 픽셀값에서 중간값

CV_GAUSSIAN

가우시안 블러

O

1,3

8u,32f

입력이 8u이면 16s, 32f 이면 32f

Param1 x param2 크기의 이웃 픽셀값의 가중치 합

CV_BILATERAL

양방향 블러

X

1,3

8u

8u

3 x 3 크기의 양방향 필터를 적용

색상 시그마 = param1

공간 시그마 = param2

단순 필터

CV_BLUR 값을 전달할 때 시행되는 단순 블러는 가장 간단한 형태의 스무딩 이다단순 블러는 1 또는 3채널, 8비트 또는 32 비트 실수형 영상에서 동작한다.


 

 

단순 블러부젼 픽셀값의 평균을 이용하여 스무딩을 수행한다왼쪽이 원본 영상이고 오른쪽이 결과 영상이다.

 

모든 스무딩 연산이 동일한 형태의 영상에서 동작하는 것은 아니다. Smoothtype 값에 CV_BLUR_NO_SCAL를 지정하면 스케일링 없는 단순 블러 연산이 수행된다이 연산은 기본적으로 단순 블러와 동일하지만 평균값 계산을 위한 나눗셈 연산이 없다이 때문에 입력 영상과 출력 영상은 서로 다른 데이터 타입을 가져야 하는데이는 계산 과정에서 오버플로가 생기는 것을 방지하기 위함이다스케일링 없는 단순 블러는 일반적으로 8비트 영상을 입력으로 받고, IPL_DEPTH_16S 또는 32S 데이터 타입의 출력 영상을 생성한다. 32비트 실수형 영상에서 실행할 경우결과 영상도 32비트 실수형 영상이다. 32비트 영상을 사용할 경우에도 반드시 지켜져야 만 한다스케일링 없는 단순 블러는 나눗셈 연산이 있는 단순 블러에 비해 연산 속도가 빠르다.


 

중간값 필터

중간값 필터는 픽셀 주변 사각형 영역에서 중간값을 선택하여 해당 픽셀의 값으로 교체하는 방식이며, smoothtype 값을 CV_MEDIAN으로 지정한다중간값 필터는 1 또는 3채널, 8비트 영상에서 동작하며원본 영상을 바꿔치기할 수 없다평균값을 사용하는 단순 블러는 홀로 독립되어 나타나는 잡음(이러한 잡음을 샷 잡음(shot noise)라고 부른다)에 민감하게 반응할 수 있다적은 개수의 픽셀에서 크게 튀는 값을 갖는 픽셀은 평균값 계산에 큰 영향을 줄 수 있기 때문이다중간값필터는 중간값을 선택함으로써 그러한 이상치를 무시할 수 있다중간값 블러주변 픽셀의 중간값을 이용하여 스무딩을 수행한다.



가우시안 필터

가우시안 필터는 동작이 빠른편은 아니지만 가장 유용한 필터이다가우시안 필터는 입력 영상의 각 픽셀에서 가우시안 커널과 컨볼루션을 하여 결과 영상을 생성한다. CvSmooth() 함수를 이용하여 가우시안 블러를 수행하려면 매개변수 값을 설정해 주어야 한다. Param1 param2에서 필터 윈도우의 가로와 세로 크기를 지정한다. Param3에는 선택적으로 가우시안 커널의 시그마값(표준편차)을 지정한다. Param3이 기본값인 0으로 설정되면 시그마 값을 자체적으로 계산하여 사용한다비대칭 모양의 커널 윈도우를 사용하려면 param4를 지정할 수 있다이 경우, param3은 가로 방향의 시그마값을, pararm4는 세로 방향의 시그마값을 나타낸다.

만약 param3 pararm4의 값을 지정하였는데 pararm1 = param2 = 0 으로 설정이되어 있다면커널 윈도우의 크기는 시그마값에 의해 자동으로 결정된다.

OpenCV는 자주 사용하는 가우시안 커널에 대하여 최적화된 성능의 스무딩을 보여준다표준 시그마값(param3 =0.0)을 갖는 3x3, 5x5, 7x7 크기의 가우시안 커널일 경우다른 커널에 비하여 연산 속도가 빠르다가우시안 블러는 8비트 또는 32비트 실수형을 갖는 1또는 3채널 영상에 대하여 적용할 수 있다.


 

양방향 필터

양방향 필터는 엣지 보존 스무딩 이라고 알려져 있는 영상 분석 방법 중의 하나이다양방향 필터는 가우시안 스무딩과 비교하면 쉽게 이해할 수 있다전형적인 가우시안 스무딩은 실제 영상의 픽셀값이 공간 상에서 천천히 변화하고이로 인하여 이웃 픽셀과 연관성을 많이 갖고 있지만 잡음은 갑작스럽게 값이 튄다는 점에서 착안되었다이러한 이유로 가우시안 스무딩은 신호는 보존하면서 잡음만 제거한다그러나 이 방법은 엣지 근처에서는 문제가 발생한다주변 값들과 상관성이 적은 엣지 부근에서도 가우시안 스무딩은 영상을 평탄하게 만듦으로써 엣지를 없애버린다양방향 필터는 약간의 연산 시간을 더 소모하지만 엣지를 보존하면서 영상의 스무딩을 수행한다.

가우시안 스무딩과 유사하게 양방향 필터 또한 각 픽셀과 주변 요소들로부터 가중 평균을 구한다이때 가중치는 두 개의 성분을 갖는데하나는 가우시안 스무딩에서 사용되는 가중치와 동일하다나머디 가중치 성분도 가우시안 가중치와 유사하지만 중심으로부터의 거리에 의해 결정되는 값이 아니라 중심 픽셀 값과의 밝기 차이에 의해 결정되는 가중치를 사용한다양방향 필터는 유사한 픽셀에 대하여 더 큰 가중치를 부여하는 가우시안 스무딩이라고 간주할 수 있다이 필터는 영상을 마치 수채화 그림처럼 바꿔주는 효과가 있다양방향 필터는 영상 분할을 위한 전처리 과정으로 사용되기도 한다양방향 필터는 두 개의 매개변수를 사용한다. Param1은 색 공간에서 사용되는 가우시안 커널의 크기를 나타낸다. Param1값이 클수록 더 넓은 분포의 밝기값(또는 생상값)이 평탄화 된다.param2는 공간 영역에서 사용되는 가우시안 커널의 너비를 나타낸다이는 가우시안 필터에서 시그마값과 유사하다.

 

 

namespace AboutOpenCV

{

    /// <summary>

    /// Window1.xaml 대한 상호 작용 논리

    /// </summary>

    public partial class Window1 : Window

    {

        WriteableBitmap wb;

        WriteableBitmap resultwb;

        IplImage src;

 

        public Window1()

        {            

            InitializeComponent();

        }

 

        private void MenuItem_Click(object sender, RoutedEventArgs e)

        {

            string imgpath; // 경로저장변수           

 

            OpenFileDialog dlg = new OpenFileDialog();

 

            dlg.DefaultExt = ".*";  //기본 확장자

            dlg.Filter = "Image Files(.*)|*.*"// 확장 파일 필터

            dlg.ShowDialog();

            imgpath = dlg.FileName;           

 

            src = new IplImage(imgpath, LoadMode.AnyColor);

            

            wb = new WriteableBitmap(src.Width, src.Height, 9696PixelFormats.Bgr24, null);

 

            WriteableBitmapConverter.ToWriteableBitmap(src,wb);         

 

            image1.Source = wb;            

            

          }

        //스무딩

 

        private void MenuItem_Click_1(object sender, RoutedEventArgs e)

        {                        

            if (src == nullreturn;

            IplImage dst = Cv.CreateImage(src.Size, BitDepth.U8, 3);

                        

            Cv.Smooth(src, dst,SmoothType.Bilateral,1,1);

            //Cv.Smooth(src, dst, SmoothType.Blur);

            //Cv.Smooth(src, dst, SmoothType.BlurNoScale);

            //Cv.Smooth(src, dst, SmoothType.Gaussian, 7);

 

            resultwb = new WriteableBitmap(dst.Width, dst.Height, 9696PixelFormats.Bgr24, null);

            

            WriteableBitmapConverter.ToWriteableBitmap(dst, resultwb);     

 

            image2.Source = resultwb;            

        }

    }

}

 

반응형

'Programing > OpenCV' 카테고리의 다른 글

영상 모폴로지 자체 커널 만들기  (0) 2016.11.30
영상 모폴로지  (0) 2016.11.30
영상 파일 포맷의 종류  (0) 2016.11.30
영상처리 컬러모델  (0) 2016.11.30
gray scale  (0) 2016.11.30
반응형

영상 파일 포맷의 종류

BMP, JPEG, RAW, GIF, PSD, TIFF 

 

BMP, JPEG 파일 포맷

영상의 색상 정보해상도 등을 알 수 있는 정보가 헤더에 포함되어 있다추가 작업이 필요해 프로그램이 더 복잡해 진다.

 

RAW파일 포맷

헤더 정보 없이 완전한 데이터만으로 구성된다복잡한 헤더 정보를 해석할 필요가 없어 영상처리가 복잡하지 않다헤더 정보가 없어 영상의 색상 정보나 해상도 정보를 사용자가 미리 알아야 하는 단점이 있다.



반응형

'Programing > OpenCV' 카테고리의 다른 글

영상 모폴로지  (0) 2016.11.30
스무딩(블러링)  (0) 2016.11.30
영상처리 컬러모델  (0) 2016.11.30
gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
반응형

RGB, CMY(K), HIS, YCrCb, YUV 등의 컬러 모델이 있다.

 

RGB 컬러 모델

Red, Green, Blue 세 가지 색상 값을 이용해 색 표시 한다.



 

색을 혼합할수록 색이 밝아지는 가산 체계 사용 한다.

RGB를 같은 비율로 혼합하면 가장 밝은 흰색

 

Red(1, 0, 0) + Green(0, 1, 0) + Blue(0, 0, 1) = White(1, 1, 1)

 

빨강색(R)과초록색(G) 혼합→ 노란색(Yellow)

 

Red(1, 0, 0) + Green(0, 1, 0) = Yellow(1, 1, 0)

 

 

CMY 컬러 모델

청록색(Cyan), 자홍색(Magenta), 노랑색(Yellow) 기본 색으로 사용 한다.

RGB 컬러 모델에서 대각선으로 마주보는 색의 모양을 서로 바꿔 놓은 것처럼 보인다.


 

 

C,M,Y 세 가지 색을 더하면 (1,1,1)dl 되어 색의 밝기가 낮아지는 감산체계를 사용 한다.

RGB컬러와는 정반대 공간에 위치하므로청록색-빨강색자홍색-초록색노랑색-파란색은 보색 관계이다.

 

컬러 모델의 가산과 감산체계


 

HSI 컬러 모델

HSI = Hue(색상), Saturation(채도), Intensity(명도)

 


 

YCrCb 모델

명도에 더 민감한 인간 눈을 감안해 YCrCb컬러 모델이 개발 되었다명도는 Y, 푸른색 정보를 Cr, 붉은색 정보를 츄로 기호화 하고 눈에 민감한 명도 정보 Y는 그대로 유지민감하지 않은 Cr Cb색상 정보는 그 양을 줄여서 사용한다정지영상 압축 표준 방식인 JPEG와 동영상 압축 표준 방식인 MPEG에서 사용 된다.

반응형

'Programing > OpenCV' 카테고리의 다른 글

스무딩(블러링)  (0) 2016.11.30
영상 파일 포맷의 종류  (0) 2016.11.30
gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
반응형





//실제로 그레이를 처리하는곳

        private void grayProcess()

        {

            result = new IplImage(src.Size, BitDepth.U8, 1); // 채널 1개짜리 메모리 확보

            Cv.CvtColor(src, result, ColorConversion.BgrToGray); //컬러를 그레이로 변환

 

            pictureBoxIpl2.ImageIpl = result; // 변환된 이미지를 픽쳐박스에 출력

        }

 

반응형

'Programing > OpenCV' 카테고리의 다른 글

영상 파일 포맷의 종류  (0) 2016.11.30
영상처리 컬러모델  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
반응형





  private void 그림읽ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

            {

                loadImage(openFileDialog1.FileName);

            }

            else

            {

                return;

            }

        }

 

        private void loadImage(String filename)

        {

            src = new IplImage(filename, LoadMode.AnyColor);

            pictureBoxIpl1.ImageIpl = src;

        }

 

//픽쳐박스를 클릭 했을 경우 새로 창을 띄워  그림으로 보여준다

        private void pictureBoxIpl2_Click(object sender, EventArgs e)

        {

            if (pictureBoxIpl2.ImageIpl == nullreturn;

 

            using (CvWindow wind = new CvWindow("결과창"))

            {

                wind.Image = result;

                Cv.WaitKey(0);

            }

        }


반응형

'Programing > OpenCV' 카테고리의 다른 글

영상처리 컬러모델  (0) 2016.11.30
gray scale  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30
반응형

OpenCV Intel에서 개발한 영상처리 라이브러리 모음으로써오픈 소스로 개발되고 있는  컴퓨터 비전 라이브러리 이다오픈 소스이기 때문에 누구나 참여할 수 있고소스 코드의 상호 검증이 가능하다기본 설꼐단계부터 실시간 연산을 목표로 만들어졌기 때문에 매우 빠르게 동작하도록 구현되어 있다. OpenCV 는 빠르고 안정적으로 구현디어 있는 컴퓨터 비전 알고리즘의 집합체이다이러한 알고리즘들을 프로그래머가 직접 개발한다면 생산성과 신뢰성이 떨어지는데, OpenCV는 이러한 기능들을 제공해 주기때문에 API로 프로그래머가 개발에만 치중 할 수 있도록 했다언어는 C언어 C++을 이용하여 작성되었고리눅스윈도우 OS 등에서 동작하고현재 파이썬매트랩 등 다른 컴퓨터 언어와 호환을 위한 개발도 진행중이다.



 

OpenCV는 크게 4개의 구성 요소로 나눌 수 있다.CV는 기본적인 영상 처리와 고수준의 컴퓨터 비전 알고리즘을 포함하고, MLL은 다양한 통계 분류와 군집화 도구 등의 기계학습 라이브러리를 담고 있다군집화 도구란 어떤 개체나 대상들의 유사성 또는 거리에 의하여 비슷한 특성을 가진 개체들이 함께 그룹 지어지도록 집단화 하는 것이다주요 목적은 각각 집단의 특성을 파악하는 것이다기계 학습은 주어진 데이터를 유용한 정보 형태로 변환하는 것이다데이터들의 집합을 기계에게 학습시킨 후새로운 데이터에 대한 질문에 기계가 대답할 수 있게끔 만드는 작업이다예를 들어 주어진 영상 안에 몇 명의 사람이 존재하냐고 질문하면 이에 대한 답을 하게 하는것이다기계학습은 데이터에서 얻은 규칙이나 패턴을 이용하여 추후 입력되는 데이터로부터 유용한 정보를 추출할 수 있다. HighGUI(high-level graphical user interface)는 입출력에 관련된 함수들과 영상비디오를 불러오고 저장하는 기능을 포함한다.

CXCORE는 기본적인 자료 구조와 알고리즘 등을 포함한다.

OpenCV활용분야

기존의 영상을 복원,강화,압출 시킬 수 있다또한 사진의 기존이미지를 시각적으로 개선시킬수 있다.

반응형

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30
이진화  (0) 2016.11.30
반응형

SIFT 알고리즘.docx

StartOpenCV.zip



SIFT 알고리즘

(영상 추적)


디지털 영상처리 개요


디지털 영상처리 기술은 영상 개선영상 복원영상 변환영상 분석영상 인식영상 압축으로 분류된다.
 그리고 구현 알고리즘은 화소 점 처리영역 처리기하학적 처리프레임 처리로 분류할 수 있다.

디지털 영상의 내부 

가로 및 세로의 크기가 M  N 픽셀로 이루어져 있다저장된 영상데이터는 차원 배열(array) 형태를 이룬다.영상 데이터의 값은 흑백 영상인 경우 각 픽셀이 0~255의 값을 가지게 되며 각 값들은 픽셀의 밝기값을 표현한다가장 어두운 픽셀은 0의 값을 가지며 255는 가장 밝은 데이터 값을 표현한다밝기를 가지는 이러한 픽셀들이 모여 한장의 그림을 구성하게 된다.

일반적인 물체 추적 시스템의 원리

카메라로부터 영상을 획득하고 필요한 전처리(processing)를 한다.

영상 속에서 물체(object)의 존재를 검출(detection)하고 물체가 존재하는 영역을 배경(background)으로부터 분할(segmentation)한다.(이때 분할된 영역은 대상이 되는 물체가 존재하는 영역과 반드시 일치하지는 않는다.)

이전 영상 프레임까지 얻은 정보로부터 추적중인 각 물체의 상태 정보에 근거하여 2단계에서 분할된 추정 영역에 속한 후보 영역과의 일치도(match)를 판정하고 현재 프레임에서의 각 물체의 상태를 갱신(update)하여 계속적으로 추적한다.

 


SIFT

David G. Lowe  Scale Invariant FeatureTransform(SIFT)라는 알고리즘을 제안했는데 이는객체의 모서리나 꼭지점 등에서 생성되는 특징 점을 벡터로 추출하여영상의 크기변화회전조명변화 등에 의한 변형에 대해 뛰어난 매칭 성능을 가진다하지만 SIFT 알고리즘은 영상을 반복적으로 연산하는 과정이 많아서 처리속도가 좋지 않다.

SIFT  서술자는 영상 변환,  크기,  회전,  노이즈 영향에도 일정한 특징 정합 성능을 유지한다. SIFT 를 이용한 특징 추출 과정은 아래 그림 처럼 크게 특징 점을 찾는 부분과 선택된 특징 점의 서술자(Descriptor)를 생성하는 두단계로 구분할 수 있다.  먼저,  특징 점 추출 단계에서는 스케일 공간상의 후보 특징 점을 추출하고 후보 특징 점의 안정성을 검사하여 안정된 특징 점의 위치를 세부 위치로 보정한다.  서술자 단계에서는 선택된 점들을 중심으로 주변 영역의 그레디언트를 통해 방향 성분을 얻게 되고,  얻어 진 방향 성분을 중심으로 관심 영역을 재설정하여 서술자를 생성하게 된다.

SIFT 알고리즘의 수행시간 및 성능을 좌우하는 요소

SIFT 알고리즘은 특징 점을 추출하기 위해 여러 가지단계를 거치는데첫 번째 단계는 같은 개체가 다른 관점에서라도 반복적으로 추출될 수 있는 크기와 위치의 후보 픽셀들을 뽑는 것이다각각의 후보픽셀에 대하여 더 세밀한 검사를 거쳐 특징 점으로 사용할지를 결정한다첫 번째 검사는 낮은 대비를 가지는 픽셀을 제거한다두 번째 검사는 모서리에 의해 추출된 특징 점을 제거한다.

반응형

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30
이진화  (0) 2016.11.30
반응형

범위 강조 변환 이란?

 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환

 원하는 부분의 화소 값이 더 커지거나 작아져 다른 부분과 비교해서 더욱 도드라져 보임



기존의 영상을 출력해주고 다시 이진화로 변환된 영상을 출력해준다.

void CImageprocesingView::OnDraw(CDC* pDC)

{

             CImageprocesingDoc* pDoc = GetDocument(); // 도큐먼트클래스참조

             ASSERT_VALID(pDoc);

             int i, j;

             unsigned char R, G, B;

             for(i=0 ; i<pDoc->m_height ; i++){

                           for(j=0 ; j<pDoc->m_width ; j++){

                                        R = G = B = pDoc->m_InputImage[i*pDoc->m_width+j];

                                        pDC->SetPixel(j+5, i+5, RGB(R, G, B));

                           }

             }

             for(i= 0 ; i<pDoc->m_Re_height; i++){

                           for(j = 0 ; j<pDoc->m_Re_width; j++){

                                        R = pDoc->m_OutputImage[i*pDoc->m_Re_width+j];

                                        G = B = R;

                                        pDC->SetPixel(j+pDoc->m_width+10, i+5, RGB(R, G, B));

                           }

             }

}

 

 

범위반전 코드

void CImageprocesingDoc::OnStressTransform2() 

{

             CRangeofstress2 dlg;

             int i;

             m_Re_height = m_height;

             m_Re_width = m_width;

             m_Re_size = m_Re_height * m_Re_width;

             m_OutputImage = new unsigned char[m_Re_size];

             if(dlg.DoModal() == IDOK){

                           for(i=0 ; i<m_size ; i++){

                                        // 입력값이강조시작값과강조종료값사이에위치하면출력

                                        if(m_InputImage[i] >= dlg.m_Start1 && m_InputImage[i] <= dlg.m_End1)

                                                     m_OutputImage[i] = dlg.m_value;

                                        else

                                                     m_OutputImage[i] = m_InputImage[i];

                           }

             }

}



반응형

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
이진화  (0) 2016.11.30
반응형

이진화란?

 이진화란 RGB값으로 다양하게 분포되어 있는 색상값을 0 1만의 값으로 표현하는 것이다실제적으로 RGB컬러 영상을 흑백(Gray channel)영상으로 바꾼뒤 특정 임계값을 기준으로 초과 값을 255이하 값은 0으로 변환한다

의도

 에지 검출시 영상의 변화 부분을 강조함으로써 물체의 윤곽선과 영상 신호 분포를 이진화 하여 나타내는 방법이다.

 

기존의 영상을 출력해주고 다시 이진화로 변환된 영상을 출력해준다.

void CImageprocesingView::OnDraw(CDC* pDC)

{

             CImageprocesingDoc* pDoc = GetDocument(); // 도큐먼트클래스참조

             ASSERT_VALID(pDoc);

             int i, j;

             unsigned char R, G, B;

             for(i=0 ; i<pDoc->m_height ; i++){

                           for(j=0 ; j<pDoc->m_width ; j++){

                                        R = G = B = pDoc->m_InputImage[i*pDoc->m_width+j];

                                        pDC->SetPixel(j+5, i+5, RGB(R, G, B));

                           }

             }

             for(i= 0 ; i<pDoc->m_Re_height; i++){

                           for(j = 0 ; j<pDoc->m_Re_width; j++){

                                        R = pDoc->m_OutputImage[i*pDoc->m_Re_width+j];

                                        G = B = R;

                                        pDC->SetPixel(j+pDoc->m_width+10, i+5, RGB(R, G, B));

                           }

             }

}

 

이진화 코드

void CImageProcessingDoc::OnBinarization()

{

             CConstantDlg dlg;

             int i;

             m_Re_height = m_height;

             m_Re_width = m_width;

             m_Re_size = m_Re_height * m_Re_width;

             m_OutputImage = new unsigned char[m_Re_size];

             if(dlg.DoModal() == IDOK){

                           for(i=0 ; i<m_size ; i++){

                                        if(m_InputImage[i] >= dlg.m_Constant)

                                                     m_OutputImage[i] = 255// 임계값보다크면출력

                                        else

                                                     m_OutputImage[i] = 0// 임계값보다작으면출력

                           }

             }

}





반응형

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30

+ Recent posts