본문 바로가기
프로그래밍˙알고리즘/C#ㆍXamarin

[C# Windows 프로그래밍]이미지를 이진화 하는 방법,이미지 이진화 예제(How to set image to binarization?)

by 승주니 2020. 4. 20.
반응형

안녕하세요

이글에서는 이미지를 2진화 시키는 방법에 대해서 알아보겠습니다.

 

일단 들어가기 앞서 이진화란?

영어로는 [Binarization] 라고 합니다.

 쉽게말해서 0과 1이라고 생각하면 편합니다.

이미지의 RGB 평균값을 구한후

지정한 값보다 높으면 1, 낮으면 0으로 처리해버리는 것입니다.

 

이렇게 0과, 1 (흑과 백)로 이미지를 표현 하는 것이 이미지 이진화라고 합니다.

주로 영상 or 사진의 특징을 판별할 때 이 기법이 사용됩니다.

 

 

Color [Name];

Color 라는 구조체 (Structure) [Name]이라는 값으로 선언합니다.

Color 구조체는 ARGB(알파, 빨강, 녹색, 파랑) 색을 나타낼 수 있고, 우리가 필요한 것은 R,G,B 입니다.

 

int rgb;

Intger 형식의 rgb를 선언합니다. 이름이 굳이 rgb가 아니여도 상관없습니다.

이후에 계산할 때 필요한 변수입니다.

 

Bitmap bmp = new Bitmap(@"C:\Test.png");

Bitmap Class를 선언해주고 이진화할 이미지의 주소를 작성해줍니다.

파일위치 입력할 때 \(원)이 들어갈 경우 C#에서 인식을 못하니 앞에 "@" 같이 작성해줍시다.

 

            for(int w = 0; w < bmp.Width; w++)
            {
                for(int h = 0; h < bmp.Height; h++)
                {
                    color = bmp.GetPixel(w, h);
                    rgb = (color.R + color.G + color.B) / 3;

                    if (rgb > value)
                    {
                        bmp.SetPixel(w, h, Color.White);
                    }
                    else
                    {
                        bmp.SetPixel(w, h, Color.Black);
                    }
                    
                }
            }

For문으로 불러온 Pixel의 너비와 높이를 불러오고, Color 구조체 color에 집어넣어 Getpixel 합니다.

Getpixel한 값들을 RGB로 쪼갠 후 다시 3으로 나눠줍니다. ( 이미지 RGB의 평균값 )

rgb > value 는 rgb와 지정된 한계값을 비교하는 식입니다.

 

 

   private void Form1_Load(object sender, EventArgs e)
        {
            hScrollBar1.Value = 50;
            hScrollBar1.Minimum = 1;
            hScrollBar1.Maximum = 500;
            
            Bitmap bitmap = new Bitmap("test.png");
            pictureBox1.Image = bitmap;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Color color; // Color 구조체
            int rgb;
            Bitmap bmp = new Bitmap("test.png");
            for(int w = 0; w < bmp.Width; w++)
            {
                for(int h = 0; h < bmp.Height; h++)
                {
                    color = bmp.GetPixel(w, h);
                    rgb = (color.R + color.G + color.B) / 3;

                    if (rgb > value)
                    {
                        bmp.SetPixel(w, h, Color.White);
                    }
                    else
                    {
                        bmp.SetPixel(w, h, Color.Black);
                    }
                    
                }
            }
            pictureBox2.Image = bmp;

        }

        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            value = hScrollBar1.Value;

        }

완벽하게 이해하기 쉽게 스크롤바를 움직여서 이진화 한계값을 조정할 수 있게끔 설정 하는 예제입니다.

 

 

Timer를 이용하시면 영상도 만들 수 있습니다!

반응형

댓글