이진 영상의 모폴로지는 기본적인 침식과 팽창 연산만 알고 있어도 충분하다그러나 그레이스케일 또는 컬러 영상의 경우유용한 모폴로지 연산들이 더 존재한다모폴로지 연산들은 모두 하나의 함수 Cv.MorphologyEx()를 이용한다.

 

public static void MorphologyEx(CvArr src, CvArr dst, CvArr temp, IplConvKernel element, MorphologyOperation operation, int iterations);

 

Cv.MorphologyEx() 함수는 두개의 새로운 매개변수를  받는다하나는 temp 배열이고다른 하나는 operation이다. Temp 배열이 선택적으로 사용된다, temp 배열이 사용되는 경우 배열은 입력 영상과동일한 크기여야 한다.

 

Operation 인자에 지정할  있는 

Operation

모폴로지 연산

Temp 영상의 필요 유무

MorphologyOperation.Open

열기

불필요

MorphologyOperation.Close

닫기

불필요

MorphologyOperation.Gradient

모폴로지 그래디언트

항상필요

MorphologyOperation.Tophat

탑 

바꿔치기 전용(src = dst)

MorphologyOperation.Blackhat

블랙 

바꿔치기 전용(src = dst)


열기와 닫기 연산

열기와 닫기 연산은 침식과 팽창 연산을 조합하여 사용함으로써 이루어진다열기 연산의 경우침식 연산을 수행한 후 팽창 연산을 수행한다열기 연산은 종종 이진 영상에서 독립된 영역들의 개수를 세기 위해서 사용된다예를 들어현미경으로 관찰한 세포 영상을 임계값을 이용하여 이진화한 후열기 연산을 수행하여 가까이 붙어 있는 세포들을 서로 떨어뜨리려 놓고 나서 세포의 수를 세곤 한다닫기 연산은 팽창을 먼저 하고 침식 연산을 수행한다닫기 연산은 연결된 구성 요소 알고리즘 등에서 잡음에 의한 원치 않은 분할을 최소한으로 줄이고자 사용한다연결된 구성 요소 레이블링을 수행하기 위해 보통 침식 또는 닫기 연산을 수행하여 잡음을 먼저 제거하고열기 연산을 수행하여 다시 가까이 인접한 큰 영역들을 합쳐준다열기 또는 닫기 연산의 결과는 침식 또는 팽창 연산의 결과와 유사하지만열기 및 닫기 연산이 연결된 영역을 보다 정확하게 보존해준다.

 

IplImage tempimage = src.Clone();

 

            IplConvKernel element = Cv.CreateStructuringElementEx(3,322ElementShape.Rect, null);

 

            Cv.MorphologyEx(src, dst, tempimage, element, MorphologyOperation.Open, 3);



모폴로지 열기 연산의 결과작은 크기의 밝은 영역은 사라지고남아 있는 밝은 역역의 크기는 유지된채 고립되어 있다.


모폴로지 닫기 연산의 결과밝은 영역들이 서로 합쳐졌지만 기본 크기는 유지하고 있다.

 

Iterations 2를 전달하여 닫기 연산을 두 번 수행하는 것은 팽창-침식-팽창-침식 연산을 수행하는 것 같은 효과를 나타낸다그러나 이러한 연산은 그다지 유용하지 않다보통의 경우팽창-팽창-침식-침식 같은 연산을 원할 것이다팽창-팽창-침식-침식과 같은 방식으로 모폴로지 연산을 수행해야 팽창-침식을 한 번 수행하는 것보다 더 큰 잡을을 제거하는 효과가 있다.

 

모폴로지 그래디언트

이 연산을 이진 영상에 적용하면 영역의 외곽선만 남기는 효과가 있다.

Gradient(src) = dilate(src) - erdoe(src)



모폴로지 그래디언트 연산의 결과주변부 엣지가 밝게 표현된다.

 

그래이스케일 영상에 대한 모폴로지 그래디언트 연산 결과는 영상에서 밝기값 변화량의 정도를 알려준다모폴로지 그래디언트는 밝은 영역 주위를 고립시켜서 이를 하나의 객체로써 다룰 수 있도록 해준다영역의 완전한 외곽선은 확정된 영역으로부터 수축된 영역을 빼는 차연산을 통해 쉽게 구할 수 있다이는 객체의 그래디언트를 계산 하는 것과는 다르다.(그래디언트 관한 소벨샤르 연산)

 

-햇 연산과 블랙-햇 연산

이들 연산은 주변보다 밝거나 어두운 영역을 고립시키는 효과가 있기 때문에 특정 객체 내부에서 밝기 변화가 두드러진 부분을 찾아내기 위해 사용된다예를 들어생체조직 또는 세포를 촬영한 현미경 영상을 다룰 때 사용되기도 한다.

TopHat(src) = src - open(src)

BlackHat(src) = close(src) - src

 

-햇 연산은 입력 영상에서 열기 연산이 수행된 영상을 빼는 연산이다열기 연산은 영상에서 밝기값이 크게 튀는 작은 덩어리를 제거하는 효과가 있다그러므로 src에서open(src)를 빼게 되면 결과적으로 원본 src영상에서 주변보다 밝았던 부분만 남아서 강조되어 보인다이러한 효과는 커널의 크기에 의존적이다이와 반대로 블랙-햇 연산은 원본 영상에서 주변보다 어두운 영역만 강조한다.


모폴로지 탑-햇 연산의 결과주변보다 밝은 영역들이 강조되었다.


모폴로지 블랙-햇 연산 결과주변보다 어두운 영역들이 강조되었다.

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

제스쳐 인식  (0) 2016.11.30
플러드필  (0) 2016.11.30
영상 모폴로지 자체 커널 만들기  (0) 2016.11.30
영상 모폴로지  (0) 2016.11.30
스무딩(블러링)  (0) 2016.11.30

OpenCV에서는 IplConvKernel 구조체를 사용하여 자체적인 모폴로지 커널을 사용할 수 있다이 커널은 Cv.CreateStructuringElementEx() 함수를 통해서 생성하고,ReleaseStructuringElement() 함수를 이용하여 해제한다

 

public static IplConvKernel CreateStructuringElementEx(int cols, int rows, int anchor_x, int anchor_y, ElementShape shape, int[,] values);

모폴로지 커널은 컨볼루션 커널과 달리 수치값을 필요로 하지 않는다모폴로지 커널의 모양은 커널이 영상을 스캔하는 동안 최대값 또는 최소값 계산에 필요한 픽셀 위치를 알려주는 역할만 할 뿐이다고정점은 커널이 원본 영상에 어떻게 정렬되어야 하는지 알려주는 역할을 하고또한 모폴로지 연산의 결과값이 원본 영상의 어느 픽셀에 대입되어야 하는지 알려준다커널을 새로 생성하려면 구성요소를 감싸는 사각형을 표현하는 cols rows를 지정해주어야 한다그 다음으로 고정점의 좌표 (x,y)를 나타내는 anchor_xanchor_y를 지정한다. CV_SHAPE_CUSTOM 값이 사용되면 정수형 배열 values에 의해 지정된 형태의 커널이 생성된다이 배열은 rows x cols 크기의 1차원 배열이며 0이 아닌 값으로 지정된 위치의 원소는 커널에서 사용되는 픽셀이다. Values null이면 모든 원소값이 0이 아닌 것으로 간주되어 사각형 형태의 커널이 생성된다.

 

다섯 번째 인자 shape 

Shape 

의미

CV_SHAPE_RECT

사각형 커널

CV_SHAPE_CROSS

십자 모양의 커널

CV_SHAPE_ELLIPSE

타원형 커널

CV_SHAPE_CUSTOM

Values 값으로 지정하는 사용자 정의 커널


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

플러드필  (0) 2016.11.30
Opencv C# 모폴로지  (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





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

        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

+ Recent posts