픽셀 기반 영상 처리 C# 소스 코드
Visual Studio 2010에서 C#으로 영상처리 프로그램 시작 글의 마지막 부분에 추가했던 [픽셀_산술덧셈]과 [픽셀_산술뺄셈] 코드부터 다시 시작한다.
픽셀 기반 처리 부분 소스 코드
1. [픽셀_산술덧셈]을 클릭했을 때 추가되었던 함수를 다음과 같이 완성한다.
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 |
private void 픽셀산술덧셈ToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); //그림파일 불러오기 if (bmp == null) return; byte[] data = f_getDataFromImage(bmp); //Bitmap 형식에서 byte 데이터만 가져오기 ///////// Start Image Processing //////////////// //영상처리 시작(산술덧셈) int addValue = 50; for (int i = 0; i < data.Length; i++) { if (data[i] + addValue > 255) { data[i] = 255; } else { data[i] = (byte)(data[i] + addValue); } } ///////// End Image Processing //////////////// //영상처리 끝(산술덧셈) Bitmap bmp2 = f_makeImageFromData(256, 256, data); //byte형 데이터를 Bitmap 형식으로 변환하기 f_drawImage(bmp, bmp2); //Form에 Bitmap 그림 출력하기 } |
2. 계속해서 [픽셀_산술뺄셈] 메뉴를 더블클릭한 후 다음코드를 완성한다.
산술 덧셈과 산술 뺄셈 코드는 대부분이 똑같고 약간의 차이만 있다.
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 |
private void 픽셀산술뺄셈ToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); //그림파일 불러오기 if (bmp == null) return; byte[] data = f_getDataFromImage(bmp); //Bitmap 형식에서 byte 데이터만 가져오기 ///////// Start Image Processing //////////////// //영상처리 시작(산술뺄셈) int subValue = 50; for (int i = 0; i < data.Length; i++) { if (data[i] - subValue < 0) { data[i] = 0; } else { data[i] = (byte)(data[i] - subValue); } } ///////// End Image Processing //////////////// //영상처리 끝(산술뺄셈) Bitmap bmp2 = f_makeImageFromData(256, 256, data); //byte형 데이터를 Bitmap 형식으로 변환하기 f_drawImage(bmp, bmp2); //Form에 Bitmap 그림 출력하기 } |
실행시킨 후에 [픽셀처리] – [픽셀_산술덧셈] 메뉴를 클릭한 후 [Lenna.raw] 파일을 선택하면 Lenna와 더 밝아진 그림이 출력된다.
계속해서 [픽셀처리] – [픽셀_산술뺄셈] 메뉴를 클릭한 후 [Lenna.raw] 파일을 선택하면 Lenna와 더 어두어진 그림이 출력된다.
3. [픽셀_산술곱셈] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
///////// Start Image Processing //////////////// double ratio = 1.2; for (int i = 0; i < data.Length; i++) { if (data[i] * ratio > 255) { data[i] = 255; } else { data[i] = (byte)(data[i] * ratio); } } ///////// End Image Processing //////////////// |
4. [픽셀_산술나눗셈] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 |
///////// Start Image Processing //////////////// double ratio = 1.2; for (int i = 0; i < data.Length; i++) { data[i] = (byte)(data[i] / ratio); } ///////// End Image Processing //////////////// |
5. [픽셀_히스토그램평활화] 메뉴를 더블 클릭하여 소스를 완성한다.
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 |
///////// Start Image Processing //////////////// double N = data.Length; int[] hist = new int[256]; int[] sum = new int[256]; for (int i = 0; i < 256; i++) { hist[i] = 0; } for (int i = 0; i < data.Length; i++) { hist[data[i]]++; } sum[0] = hist[0]; for (int i = 1; i < 256; i++) { sum[i] = sum[i - 1] + hist[i]; } for (int i = 0; i < data.Length; i++) { int k = data[i]; data[i] = (byte)(sum[k] / N * 255); } ///////// End Image Processing //////////////// |
6. [픽셀_기본 명암대비 스트레칭] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
///////// Start Image Processing //////////////// double max = 0; double min = 255; for (int i = 0; i < data.Length; i++) { if (data[i] > max) max = data[i]; if (data[i] < min) min = data[i]; } for (int i = 0; i < data.Length; i++) { data[i] = (byte)((data[i] - min) / (max - min) * 255); } ///////// End Image Processing //////////////// |
7. [픽셀_두영상의 산술덧셈] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Bitmap bmp2 = f_OpenBitmapFile(); if (bmp2 == null) return; byte[] data2 = f_getDataFromImage(bmp2); ///////// Start Image Processing //////////////// if(data.Length != data2.Length){ MessageBox.Show("두 영상의 크기나 색상 모델이 달라 실행 불가능합니다."); return; } for (int i = 0; i < data.Length; i++) { int value = data[i] + data2[i]; if (value > 255) { data[i] = (byte)255; } else { data[i] = (byte)(value); } } ///////// End Image Processing //////////////// |
8. [픽셀_두영상의 산술뺄셈] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Bitmap bmp2 = f_OpenBitmapFile(); if (bmp2 == null) return; byte[] data2 = f_getDataFromImage(bmp2); ///////// Start Image Processing //////////////// if (data.Length != data2.Length) { MessageBox.Show("두 영상의 크기나 색상 모델이 달라 실행 불가능합니다."); return; } for (int i = 0; i < data.Length; i++) { int value = data[i] - data2[i]; if (value < 0) { data[i] = 0; } else { data[i] = (byte)(value); } } ///////// End Image Processing //////////////// |
9. [픽셀_이진화] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
///////// Start Image Processing //////////////// if (bmp.PixelFormat != PixelFormat.Format8bppIndexed) { MessageBox.Show("8bit 색상 모델만 실행 가능합니다."); return; } int threshold = 127; for (int i = 0; i < data.Length; i++) { if (data[i] > threshold) { data[i] = (byte)255; } else { data[i] = (byte)0; } } ///////// End Image Processing //////////////// |
10. [픽셀_역상] 메뉴를 더블 클릭하여 소스를 완성한다.
1 2 3 4 5 6 7 8 9 10 11 |
///////// Start Image Processing //////////////// if (bmp.PixelFormat != PixelFormat.Format8bppIndexed) { MessageBox.Show("8bit 색상 모델만 실행 가능합니다."); return; } for (int i = 0; i < data.Length; i++) { data[i] = (byte)(255 - data[i]); } ///////// End Image Processing //////////////// |