본문 바로가기

Image Processing

[영상처리/C언어] Raw 포맷의 이미지 읽기

C를 활용해서 디지털 영상 처리와 관련한 가벼운 주제로 공부할 계획입니다.

IDE는 Visual Studio를 활용합니다.

 

이번 포스팅의 주제는 raw 파일 이미지 읽기 및 복사입니다. raw 포맷은 다른 bmp,jpg,gif,png 등... 과는 달리 단어 그대로 가공되지 않은 수치 값을 가지고 있는 데이터 포맷입니다. 따라서 시각화 하기 위해서 Dabwa 프로그램을 활용하여 시각화 할 수 있습니다. 유명한 Lenna 이미지를 통해서 진행했습니다. 512 x 512 x 1 흑백이미지를 사용했고 파일의 크기는 256 kb입니다.

Lenna 이미지

먼저 라이브러리를 불러오고, Size를 정의해 줍니다.

#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VER 512
#define HOR 512
#define F_SIZE (VER*HOR)

 

1차원 형태, 2차원 형태로 데이터를 받을 메모리를 할당해 줍니다.

unsigned char* alloc_pic(int SIZE)
{
	unsigned char* pic;

	if ((pic = (unsigned char*)calloc(SIZE, sizeof(unsigned char))) == NULL)
	{
		printf("\n malloc_picture : Picture structure \n");
		exit(1);
	}
	return pic;
}

unsigned char** alloc_pic_2d(int width, int height)
{
	unsigned char** pic;
	int i;

	if ((pic = (unsigned char**)calloc(height, sizeof(unsigned char*))) == NULL)
	{
		printf("\n malloc_picture : Picture structure \n");
		exit(1);
	}

	for (i = 0; i < height; i++)
	{
		if ((pic[i] = (unsigned char*)calloc(width, sizeof(unsigned char))) == NULL)
		{
			printf("\n malloc_picture : Picture structure \n");
			exit(1);
		}
	}
	return pic;
}

 

raw포맷의 데이터를 fin1에 저장하고 fout1에 복사하여 저장하기 File 구조체를 활용합니다.

int i, j;

unsigned char* ori_pic = alloc_pic(F_SIZE);
unsigned char* modi_pic = alloc_pic(F_SIZE);

unsigned char** ori_pic_2d = alloc_pic_2d(HOR, VER);
unsigned char** modi_pic_2d = alloc_pic_2d(HOR, VER);

FILE* fin1, * fin2, * fout1, * fout2;

fin1 = fopen("Lena_512.raw", "rb");
fout1 = fopen("Copy_Lena_512.raw", "wb");

fin2 = fopen("Lena_512.raw", "rb");
fout2 = fopen("Copy_Lena_512_2d.raw", "wb");

if (!fin1)
{
	printf("ERROR :: File Can't Read\n");
	exit(1);
}
if (!fout1)
{
	printf("ERROR :: File Can't Save\n");
	exit(1);
}
if (!fin2)
{
	printf("ERROR :: File Can't Read\n");
	exit(1);
}
if (!fout2)
{
	printf("ERROR :: File Can't Save\n");
	exit(1);
}

 

ori_pic에 fin1의 데이터를 입력하고, memcpy 함수를 통해 modi_pic 복사하는 방법

index를 통해 접근해서 2차원형태로 modi_pic_2d에 복사하는 방법

2가지 방법을 통해 읽기, 쓰기를 진행 했습니다.

fread((void*)ori_pic, sizeof(unsigned char), F_SIZE, fin1);
memcpy(modi_pic, ori_pic, F_SIZE * sizeof(unsigned char));
fwrite(modi_pic, sizeof(unsigned char), F_SIZE, fout1);

for (i = 0; i < VER; i++)
	fread(ori_pic_2d[i], sizeof(unsigned char), HOR, fin2);
for (j = 0; j < VER; j++)
{
	for (i = 0; i < HOR; i++)
	{
		modi_pic_2d[j][i] = ori_pic_2d[j][i];
	}
}

for (i = 0; i < VER; i++)
	fwrite(modi_pic_2d[i], sizeof(unsigned char), HOR, fout2);

 

메모리 사용을 마친 후에는 할당을 해주는게 좋습니다

fclose(fin1);
fclose(fout1);
fclose(fin2);
fclose(fout2);

for (i = 0; i < VER; i++)
{
	free(ori_pic_2d[i]);
	free(modi_pic_2d[i]);
}

free(ori_pic_2d);
free(modi_pic_2d);
free(ori_pic);
free(modi_pic);

 

이렇게 기존의 raw포맷의 흑백 이미지를 읽고 복사해서 저장하는 코드를 작성해봤습니다!