전기전자/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();






