CHIP KIDD

[C#] 7. 그림파일 알고리즘 Basic 본문

전기전자/C# 시각화프로그래밍

[C#] 7. 그림파일 알고리즘 Basic

쑨야미 2021. 4. 14. 19:08

영상처리 기본 알고리즘

1. 바이너리 파일 -> 그림파일 -> 픽샐마다 0~255 사이의 밝기값 존재

2. 바이너리 파일 처리 알고리즘 1) 파일열고 2)파일 읽고 처리 3)파일닫기

3. 아래는 파일 처리 알고리즘과, 파일 불러오고 닫는 과정을 구현한 것. 

//위의 기준 127대신에  중간값으로 처리
            string fullName2 = "C:\\images\\Etc_Raw(squre)\\512\\LENNA512.raw";
            BinaryReader br2 = new BinaryReader(File.Open(fullName2, FileMode.Open));

            //2단계 파일 처리하기...내맘대로
            //파일 --> 메모일(배열)
            int ROW2 = 512, COL2 = 512;
            byte[,] image2 = new byte[ROW2, COL2];
            for (int i = 0; i < ROW2; i++)
            {
                for (int k = 0; k < COL2; k++)
                {
                    image2[i, k] = br2.ReadByte();
                }
            }

            byte tmp; // swap을 위한 변수
            int i_x, i_y; // 기준점의 index
            int k_x, k_y; // 비교대상의 index
            int least_x, least_y; // 최솟값의 index를 가리키는 변수

            for (int i = 0; i < ROW2 * COL2; i++)
            {
                i_x = i / COL2;
                i_y = i % ROW2;

                least_x = i_x;
                least_y = i_y;
                for (int k = i; k < ROW2 * COL2; k++)
                {
                    k_x = k / COL2;
                    k_y = k % ROW2;
                    if (image2[least_x, least_y] > image2[k_x, k_y])
                    {
                        least_x = k_x;
                        least_y = k_y;
                    }
                }
                tmp = image2[i_x, i_y];
                image2[i_x, i_y] = image2[least_x, least_y];
                image2[least_x, least_y] = tmp;

            }
            printImage(image2);
            int mean;
            mean = image[ROW2 / 2 - 1, COL2 - 1];
            //mean = (int)((image[255, 511] + image[256, 0]) / 2);
            Console.WriteLine(mean);

            br2.Close();


            
            
            //다시 정렬 
            string fullName3 = "C:\\images\\Etc_Raw(squre)\\512\\LENNA512.raw";
            BinaryReader br3 = new BinaryReader(File.Open(fullName3, FileMode.Open));

            //2단계 파일 처리하기...내맘대로
            //파일 --> 메모일(배열)
            int ROW3 = 512, COL3 = 512;
            byte[,] image3 = new byte[ROW3, COL3];
            for (int i = 0; i < ROW3; i++)
            {
                for (int k = 0; k < COL3; k++)
                {
                    image3[i, k] = br3.ReadByte();
                }
            }

            

            for (int i = 0; i < ROW3; i++)
            {
                for (int k = 0; k < COL3; k++)
                {
                    if (image3[i, k] - mean < 0)
                    {
                        image3[i, k] = 0;
                    }
                    else
                    {
                        image3[i, k] = 255;
                    }
                }
            }


            printImage(image3);

            //3단계 파일닫기
            br3.Close();​
using System;
using System.IO;

namespace Day02_03_바이너리_파일_처리
{
    class Program
    {
        //사진부분프린트
        static void printImage(byte[,] img)  //함수개념
        {
            Console.WriteLine();
            for (int i = 0; i < 20; i++)
            {
                for (int k = 0; k < 20; k++)
                {
                    Console.Write("{0:d3} ", img[i, k]);
                }
                Console.WriteLine();
            }
        }

        //사진이 어둡다. 50만큼 밝게하고 출력하기
        static void LightVolumUp(byte[,] img, int ROW, int COL)
        {
            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    if (img[i, k] + 50 > 255)
                    {
                        img[i, k] = 255;
                    }
                    else
                    {
                        img[i, k] = (byte)(img[i, k] + 50);
                    }
                }
            }
        }



        //사진이 너무 밝다. 100만큼 어둡게하고 출력하기

        static void LightVolumDown(byte[,] img, int ROW, int COL)
        {
            Console.WriteLine();

            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    if (img[i, k] - 100 < 0)
                    {
                        img[i, k] = 0;
                    }
                    else
                    {
                        img[i, k] = (byte)(img[i, k] - 100); ;
                    }
                }
            }
        }



        //사진반전처리하기
        static void reversePicture(byte[,] img, int ROW, int COL)
        {
            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    img[i, k] = (byte)(255 - img[i, k]);

                }
            }
        }

        //127기준 회색영상을 흑백영상으로 만들기
        static void PictureDarkMode_127(byte[,] img, int ROW, int COL)
        {
            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    if (img[i, k] - 127 < 0)
                    {
                        img[i, k] = 0;
                    }
                    else
                    {
                        img[i, k] = 255;
                    }
                }
            }
        }

        //위의 기준 127대신에 평균값으로 처리
        static void PictureDarkMode_hap(byte[,] img, int ROW, int COL)
        {
            int hap;
            hap = 0;
            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    hap += img[i, k];

                }
            }
            Console.WriteLine(hap);
            hap = hap / (ROW * COL);

            Console.WriteLine(hap);

            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    if (img[i, k] - hap < 0)
                    {
                        img[i, k] = 0;
                    }
                    else
                    {
                        img[i, k] = 255;
                    }
                }
            }
        }
            

        //불러오기
        static void Main(string[] args)
        {
            //1단계 파일 열기 
            string fullName = "C:\\images\\Etc_Raw(squre)\\512\\LENNA512.raw";
            BinaryReader br = new BinaryReader(File.Open(fullName, FileMode.Open));

            //2단계 파일 처리하기...내맘대로
            //파일 --> 메모일(배열)
            int ROW = 512, COL = 512;
            byte[,] image = new byte[ROW, COL];
            for (int i = 0; i < ROW; i++)
            {
                for (int k = 0; k < COL; k++)
                {
                    image[i, k] = br.ReadByte();
                }
            }

            printImage(image);


            PictureDarkMode_hap(image, ROW, COL);
            printImage(image);
            Console.WriteLine();

            LightVolumUp(image, ROW, COL);
            printImage(image);
            Console.WriteLine();
            
            LightVolumDown(image, ROW, COL);
            printImage(image);
            Console.WriteLine();

            reversePicture(image, ROW, COL);
            printImage(image);
            Console.WriteLine();

         

            PictureDarkMode_127(image, ROW, COL);
            printImage(image);
            Console.WriteLine();

            br.Close();

밝기 +50 
밝기 -100
밝기 전환
밝기 127기준으로 흑백처리
밝기 표준값 기준으로 흑백처리
밝기 중앙값 구하기
밝기 중앙값 기준으로 흑백처리