주파수 영역처리 C#소스 코드(이산 코사인 변환) [주파수_이산코사인변환(DCT)] 메뉴를 더블클릭한 후 private void 주파수이산코사인변환DCTToolStripMenuItem_Click() 함수를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
private void 주파수이산코사인변환DCTToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); if (bmp == null) return; byte[] data = f_getDataFromImage(bmp); ///////// Start Image Processing //////////////// if (bmp.PixelFormat != PixelFormat.Format8bppIndexed) { MessageBox.Show("8bit 색상 모델만 실행 가능합니다."); return; } byte[] newdata = f_DCT_Original(data, bmp.Width, bmp.Height); ///////// End Image Processing //////////////// Bitmap bmpResult = f_makeImageFromData(bmp.Width, bmp.Height, bmp.PixelFormat, newdata); f_drawImage(bmp, bmpResult); } |
f_DCT_Original() 함수를 생성한다. 순수 DCT 변환 함수
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
|
private byte[] f_DCT_Original(byte[] inputImg, int width, int height) { double[] dct = new double[inputImg.Length]; for (int v = 0; v < height; v++) { for (int u = 0; u < width; u++) { dct[v * width + u] = 0.0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { dct[v * width + u] += inputImg[y * width + x] * Math.Cos(((2.0 * x + 1.0) * u * Math.PI) / (2.0 * width)) * Math.Cos(((2.0 * y + 1.0) * v * Math.PI) / (2.0 * height)); } } dct[v * width + u] *= 2.0 / Math.Sqrt((double)(width * height)); if (u == 0) dct[v * width + u] *= 1.0 / Math.Sqrt(2.0); if (v == 0) dct[v * width + u] *= 1.0 / Math.Sqrt(2.0); } } byte[] resultImg = new byte[inputImg.Length]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int value = (int)(30 * Math.Log(1.0 + dct[y * width + x])); if (value < 0) value = 0; if (value > 255) value = 255; resultImg[y * width + x] = (byte)value; } } return resultImg; } |
[주파수_fastDCT] 메뉴를 더블클릭한 후 private void 주파수fastDCTToolStripMenuItem_Click() 함수를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
private void 주파수fastDCTToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); if (bmp == null) return; byte[] data = f_getDataFromImage(bmp); ////////////////// Start if (bmp.PixelFormat != PixelFormat.Format8bppIndexed) { MessageBox.Show("8bit 색상 모델만 실행 가능합니다."); return; } double[] dct = f_DCT_Fast(data, bmp.Width, bmp.Height); byte[] newdata = f_DCT_toImage(dct, bmp.Width, bmp.Height); ////////////////// End Bitmap bmpResult = f_makeImageFromData(bmp.Width, bmp.Height, newdata); f_drawImage(bmp, bmpResult); } |
f_DCT_1D() 함수를 생성한다.1차원 DCT 변환 함수 생성
|
private void f_DCT_1D(double[] in1, double[] out1, int count) { for (int u = 0; u < count; u++) { double z = 0; for (int x = 0; x < count; x++) { z += in1[x] * Math.Cos(Math.PI * u * (2 * x + 1) / (2 * count)); } if (u == 0) z = z * (1.0 / Math.Sqrt(2.0)); out1[u] = z * Math.Sqrt(2.0 / count); } } |
f_DCT_2D() 함수를 생성한다. 2차원… Continue Reading 주파수 영역처리 C#소스 코드(이산 코사인 변환)