본문 바로가기
C#/C# Windows Form

C# 그레이스케일 모노크롬

by TcTT 2017. 6. 1.
반응형

C# 이미지 그레이스케일(흑백), 모노크롬(이진화)


영상처리에서 많이보던 내용이고...

C#에서의 영상처리는 OpenCv Sharp , EmguCv를 사용하는거로 알고있다.


하지만 간단한 영상처리는 C# 내부함수와 적절한 연산을통해서도 할 수 있다.


소스코드 다운로드 :

ImageConvert.zip



button1_Clikc => 이미지 Load

button2_Clikc => 이미지 흑백

button3_Clikc => 이미지 이진화


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
        private void button1_Click(object sender, EventArgs e)
        {
            // 이미지 로드
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.DefaultExt = "jpg";
            openFile.Filter = "Graphics interchange Format (*.jpg)|*.jpg|All files(*.*)|*.*";
            openFile.ShowDialog();
            
            // 만약파일이선택되었으면
            if (openFile.FileName.Length > 0)
            {
                image = new Bitmap(openFile.FileName);
 
                // 이미지를 픽쳐박스 사이즈에 맞게 출력.
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox1.Image = image;
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Color col;
            int Average;
 
            //x 는 image의 width
            //y 는 image의 hediht
            for (int x = 0; x < image.Width; x++)
            {
                for (int y = 0; y < image.Height; y++)
                {
                    //for문을 돌며 이미지 그레이스케일화
                    //그레이스케일은 약간식 다른방법으로도 가능하니 다른걸 사용해도 무관하다.
                    col = image.GetPixel(x, y);
                    Average = (col.R + col.G + col.B) / 3;
 
                    col = Color.FromArgb(Average, Average, Average);
                    image.SetPixel(x, y, col);
                }
            }
            pictureBox1.Image = image;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            //이진화를 하기전, 그래이스케일을 거치고 해야 원하는 데이터를 얻을확률이 높다.
            Color col;
            int Average;
 
            for (int i = 0; i < image.Size.Width; i++)
            {
                for (int j = 0; j < image.Size.Height; j++)
                {
                    col = image.GetPixel(i, j);
                    Average = (col.R + col.G + col.B) / 3;
 
                    //이진화 흑, 백 위치를 변경하려면 아래 if문 주석위치 변경.
                    //이진화에 한계값은 120으로지정.. 0~255 사이의 숫자로 조정하면된다.
                    if (Average <= 120)
                    {
                        //image2.SetPixel(i, j, Color.White);
                        image.SetPixel(i, j, Color.Black);
                    }
                    else
                    {
                        //image2.SetPixel(i, j, Color.Black);
                        image.SetPixel(i, j, Color.White);
                    }
                }
            }
            pictureBox1.Image = image;
        }
cs





예외처리가 안되있기때문에, 실행순서는 이미지 Load 후, 흑백처리,

 이진화 형식으로 진행해야한다.


이미지를 불러오면 흑백버튼을 사용해서 이미지를 흑백으로변경한다.

이미지사이즈가 크다면, 컨버팅하는데 오래걸릴거다...

오래걸리는이유는 for문을통해 0,0 -> 0,1 -> 0,2 부터시작해서

100,10 -> 100,11 이런식으로 모든 이미지 픽셀값을 읽어 그레이스케일을 한다...

4000, 4000 사이지를 흑백화하는데 10초정도 소요되는거같다.


흑백화가 완료되면 이미지 이진화버튼을 클릭하여 모노크롬(이진화)를 진행한다.

한계값은 120으로 줬으며 프로그램 소스에 주석을 잘 달아뒀으니 확인해보면된다!


반응형

'C# > C# Windows Form' 카테고리의 다른 글

C# AutoIt 응용  (0) 2017.06.05
C# 폼간 데이터 전송  (0) 2017.06.05
C# 형변환  (0) 2017.05.31
C# 시작 폼 변경하기  (0) 2017.05.15
C# Aria 암호화  (0) 2017.05.10