안녕하세요
이글에서는 이미지를 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를 이용하시면 영상도 만들 수 있습니다!
'프로그래밍˙알고리즘 > C#ㆍXamarin' 카테고리의 다른 글
[C# Windows 프로그래밍] 쓰레드 생성, 멀티 쓰레드를 사용하는 이유 (2) | 2020.04.22 |
---|---|
[C# Windows 프로그래밍] WebClient 클래스를 사용하여 간단한 웹 파싱 하기(Web Parsing) (0) | 2020.04.22 |
[C# Windows 프로그래밍] PostMessage로 계좌입출금 확인을 해보자! [2강] (카카오뱅크 입출금 확인하기) (2) | 2020.04.21 |
[C# Windows 프로그래밍] PostMessage로 계좌입출금 확인을 해보자! [1강] (카카오뱅크 입출금 확인하기) (0) | 2020.04.21 |
[C# Windows 프로그래밍] dotPeek를 사용하여 .Net 기반 프로그램 디컴파일 하는 방법 (0) | 2020.04.20 |
댓글