일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 카운터
- stepmotor
- 펌웨어
- AMBA
- AXI4
- ERROR RESPONSE
- SoC
- Verilog
- STM32
- FGPA #반도체설계 #verilog #시프트레지스터 #uart
- single copy atomic size
- APB3
- 스텝모터
- tff
- ordering model
- FPGA
- Interoperability
- T flip flop
- out-of-order
- 레지스터슬라이스
- Multiple transaction
- 임베디드시스템
- cacheable
- QoS
- Multiple outstanding
- ABMA
- AXI3
- 구조적모델링
- atomic access
- Low-power Interface
Archives
- Today
- Total
CHIP KIDD
[C#] 7. 그림파일 알고리즘 Basic 본문
영상처리 기본 알고리즘
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();
'전기전자 > C# 시각화프로그래밍' 카테고리의 다른 글
[C#] 9. 영상처리 프로그램 (WinForm, SubForm 이용하기) (1) | 2021.04.16 |
---|---|
[C#] 8. GUI를 이용한 영상처리 프로그램 (1) | 2021.04.15 |
[C#] 6. 파일처리 바이너리파일 (0) | 2021.04.14 |
[C#] 5. 파일처리(텍스트파일) (0) | 2021.04.14 |
[C#] 4. 2차원 배열 (0) | 2021.04.14 |