티스토리 뷰

C언어

[C언어] 2.기본적인 영상처리(1)

용감한 우디 2024. 11. 7. 13:32

안녕하세요!

오늘은 raw파일에 대해 색반전, 밝기조절 하는 방법에 대해 알아보겠습니다.

( 1차원 배열 메모리할당 방법을 이용하겠음. )

 

먼저,

앞 글을 먼저 보고 오시는 것을 추천드립니다.

https://unrunhy.tistory.com/1

 

각각의 픽셀값은 unsigned char형으로 0~255의 값이 들어갈 수 있는데요.

0 = 검은색

255 = 흰색

을 나타내는 것을 알아두어야 합니다.

 

● 색 반전

흑백 이미지에서 색을 반전시킨다는 것은 

검은색을 흰색으로, 흰색을 검은색으로 바꾼다는 것을 의미합니다.

 

결론부터 말하자면 아래의 코드와 같습니다.

unsigned char pix; // pix = 임의의 픽셀 값 ( 0 ~ 255 )
unsigned char Ipix = 255 - pix; // pix에 대한 반전 픽셀 값

255에서 임의의 픽셀값을 빼주면 됩니다.

 

색 반전 코드

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
#define VER 512 
#define HOR 512 
#define F_SIZE (VER*HOR) 
 
unsigned char * alloc_pic(int SIZE); // 1차원 배열 메모리 생성 함수
 
int main() 
{
	int i, j; 
  
	unsigned char * ori_pic = alloc_pic(F_SIZE); 
	unsigned char * modi_pic = alloc_pic(F_SIZE); 
 
	FILE *fin, *fout1;
 
	fin = fopen("Lena_512.raw","rb"); // 읽기 모드로 스트림 생성
	fout1 = fopen("Inverse_Lena","wb"); // 쓰기 모드로 스트림 생성
 
	if(!fin) {printf("ERROR :: File Can't Read\n"); exit(1);} // 파일을 읽을 수 없습니다.
	if(!fout1) {printf("ERROR :: File Can't Save\n"); exit(1);} // 파일을 저장할 수 없습니다.
 
	fread(ori_pic, sizeof(unsigned char), F_SIZE, fin); // "Lena_512.raw" 에 있는 데이터를 ori_pic에 저장
 
	for( i = 0; i < F_SIZE; i++) {
		modi_pic[i] = 255 - ori_pic[i]; // 각각의 픽셀들에 대한 색 반전
	}
 
 	fwrite(modi_pic, sizeof(unsigned char), F_SIZE, fout1); // modi_pic에 있는 색 반전 데이터를 "Inverse_Lena_512.raw"에 쓰기
 
	fclose(fin);
	fclose(fout1);
 
	free(ori_pic);
	free(modi_pic);
 
	printf("success");
 
	return 0;
 }
 
 /*** 1차원 배열 메모리 할당 function ***/
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;
}

 

 

밝기 조절

더 밝게 만들고 싶다면, 255에 더 가깝게

더 어둡게 만들고 싶다면, 0에 더 가깝게 만들어주는 것 입니다.

 

만약 픽셀값이 50만큼 더 밝게 만들고 싶다면

1 -> 51  

152 -> 202 

모든 픽셀 값에 대해서 50을 더해주면 됩니다. 

 

여기서, 픽셀값이 240이라면 어떡할까요?

240 -> 290 ( X ) unsigned char의 범위를 벗어나게 됩니다.

 

따라서

205 ~ 255 까지의 값은 전부 255으로 저장해주시면 되겠습니다.

 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
#define VER 512 
#define HOR 512 
#define F_SIZE (VER*HOR) 
 
unsigned char * alloc_pic(int SIZE); // 1차원 배열 메모리 생성 함수
 
int main() 
{
	int i, j; 
  
	unsigned char * ori_pic = alloc_pic(F_SIZE); 
	unsigned char * modi_pic = alloc_pic(F_SIZE); 
 
	FILE *fin, *fout2, *fout3;
 
	fin = fopen("Lena_512.raw","rb"); // 읽기 모드로 스트림 생성
	fout2 = fopen("Up_50_Lena_512.raw","wb"); // 쓰기 모드로 스트림 생성
    fout3 = fopen("Down_50_Lena_512.raw","wb"); // 쓰기 모드로 스트림 생성
 
	if(!fin) {printf("ERROR :: File Can't Read\n"); exit(1);} // 파일을 읽을 수 없습니다.
	if(!fout2) {printf("ERROR :: File Can't Save\n"); exit(1);} // 파일을 저장할 수 없습니다.
	if(!fout3) {printf("ERROR :: File Can't Save\n"); exit(1);} // 파일을 저장할 수 없습니다.
	
    fread(ori_pic, sizeof(unsigned char), F_SIZE, fin); // "Lena_512.raw" 에 있는 데이터를 ori_pic에 저장
 
 	/*** 50만큼 밝게 ***/
	for( i = 0; i < F_SIZE; i++){
		if( ori_pic[i] > 205) { // 기존 픽셀값이 205보다 크다면
			modi_pic[i] = 255; // modi_pic[i]를 255으로 고정
		}
		else{ modi_pic[i] = ori_pic[i] + 50; } // 아니면 +50
	}
	fwrite(modi_pic, sizeof(unsigned char), F_SIZE, fout2); // modi_pic에 있는 데이터를 "Up_50_Lena_512.raw"에 쓰기
 
 	/*** 50만큼 어둡게 ***/
	for( i = 0; i < F_SIZE; i++){
		if( ori_pic[i] < 50) { // 기존 픽셀값이 50보다 작다면
			modi_pic[i] = 0; // modi_pic[i]를 0으로 고정
		}
		else{ modi_pic[i] = ori_pic[i] - 50; } // 아니면 -50
	}
	fwrite(modi_pic, sizeof(unsigned char), F_SIZE, fout3); // modi_pic에 있는 데이터를 "Down_50_Lena_512.raw"에 쓰기
    
	fclose(fin);
	fclose(fout2);
	fclose(fout3);
 
	free(ori_pic);
	free(modi_pic);
 
	printf("success");
 
	return 0;
 }
 
 /*** 1차원 배열 메모리 할당 function ***/
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;
}

 

 

 결과

잘 알려진 Lena.raw파일 (흑백)을 이용해 색반전 및 밝기 조절을 하겠습니다.

 

색 반전 코드 결과

< 색 반전 코드 실행 전 >

 

< 색 반전 코드 실행 >

 

< 색 반전 코드 실행 후 >

 

 

색 밝기 조절 코드 결과

< 색 밝기 조절 코드 실행 전 >
< 색 밝기 조절 코드 실행 >
< 색 밝기 조절 코드 실행 후 >

이로써 색 반전과, 밝기 조절을 성공했습니다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함