원본
3x3
5x5
-
/// 흑백 BMP 영상의 역상을 계산
-
-
#include <stdio.h> //파일입출력, 프린트f
-
#include <windows.h> //비트맵 파일헤더 구조체, 비트맵 인포헤더 구조체가 여기 있어서...
-
#include <math.h> //abs();
-
-
#define BYTE unsigned char
-
#define WIDTHBYTES(bits) (( (bits) + 31) / 32 * 4 ) // 영상 가로길이는 4바이트의 배수여야 함
-
//(영상의 가로사이즈를 비트단위로 넣으면 4의 배수로 만들어줭)
-
//이게 왜 4배가 되야되냐? 지금하드가 ntfs..디스크가 4바이트씩 읽음(블럭인가?) 주소도 데이타 처리도 4바이트씩 하고있음.
-
//영상의 가로사이즈를 4의 배수로 맞추면 영상의 전체 크기도 4의 배수가됨
-
//256이면 걍 쓰고 ...258이면 260바이트를 써야됨.
-
-
void swap(unsigned char * a, unsigned char *b)
-
{
-
unsigned char temp;
-
temp = *a;
-
*a = *b;
-
*b = temp;
-
}
-
-
void sorting(unsigned char * Arr, int ArrSize)
-
{
-
int i,j;
-
for(i=0;i<ArrSize-1;i++)
-
{
-
for(j=i+1;j<ArrSize;j++)
-
{
-
if(Arr[i]>Arr[j])
-
swap(&Arr[i],&Arr[j]);
-
}
-
}
-
}
-
-
-
-
-
void main()
-
{
-
FILE *infile;
-
-
-
-
-
infile=fopen("salt.bmp", "rb");
-
if(infile==NULL) { printf("There is no file!!! "); exit(1); }
-
-
BITMAPFILEHEADER hf; //파일헤더 구조체
-
fread(&hf,sizeof(BITMAPFILEHEADER),1,infile); // 파일헤드를 읽음 ..1은 머냐?
-
if(hf.bfType!=0x4D42) exit(1); //0x4D42는 BM임. BM이 아니면 안되게 bftype은 파일형식...BM은 비트맵인듯
-
-
BITMAPINFOHEADER hInfo; //인포헤더 (영상헤더라 부르니?)
-
fread(&hInfo,sizeof(BITMAPINFOHEADER),1,infile); // 영상헤드를 읽음
-
printf("Image Size: (%3dx%3d) ",hInfo.biWidth,hInfo.biHeight);
-
printf("Pallete Type: %dbit Colors ",hInfo.biBitCount);
-
-
-
if(hInfo.biBitCount!=8 ) { printf("Bad File format!!"); exit(1); } // 256칼라 이하의 경우는 취급하지 않음
-
-
RGBQUAD hRGB[256];
-
fread(hRGB,sizeof(RGBQUAD),256,infile); // 팔레트를 파일에서 읽음 ...256은 머냐?
-
-
-
// 영상데이타를 저장할 메모리 할당
-
BYTE *lpImg = new BYTE [hInfo.biSizeImage]; //동적할당 해야됭.이미지는 대부분. BYTE는 unsigned char
-
BYTE *OutImg = new BYTE [hInfo.biSizeImage]; //동적할당 해야됭.이미지는 대부분. BYTE는 unsigned char
-
-
fread(lpImg,sizeof(char),hInfo.biSizeImage,infile);
-
fclose(infile);
-
-
//미디언 표현
-
-
-
unsigned char median[9] = {0,};
-
-
-
for(int i = 1 ; i < hInfo.biHeight ; i++) //1부터 세로사이즈 만큼 행을 바꿔주는거? 3x3이라서 1부터시작
-
{
-
for(int j = 1 ; j < hInfo.biWidth ; j++) //열을 바꿔주는거 3x3이라서 1부터시작
-
{
-
for(int k = -1 ; k < 2 ; k++)
-
{
-
for(int p = -1 ; p < 2 ; p++)
-
{
-
median[(k+1)*3+(p+1)] = lpImg[(i+k)*hInfo.biWidth+(j+p)];
-
-
}
-
}
-
sorting(median,9);
-
OutImg[i*hInfo.biWidth+j] = median[4];
-
}
-
}
-
-
//여긴 5x5의 경우...결과값이 더 좋음
-
// unsigned char median[25] = {0,};
-
-
-
//for(int i = 1 ; i < hInfo.biHeight ; i++) //1부터 세로사이즈 만큼 행을 바꿔주는거? 3x3이라서 1부터시작
-
//{
-
// for(int j = 1 ; j < hInfo.biWidth ; j++) //열을 바꿔주는거 3x3이라서 1부터시작
-
// {
-
// for(int k = -2 ; k < 3 ; k++)
-
// {
-
// for(int p = -2 ; p < 3 ; p++)
-
// {
-
// median[(k+2)*5+(p+2)] = lpImg[(i+k)*hInfo.biWidth+(j+p)];
-
//
-
// }
-
// }
-
// sorting(median,25);
-
// OutImg[i*hInfo.biWidth+j] = median[12];
-
// }
-
//}
-
-
-
-
-
-
FILE *outfile = fopen("OutImg.bmp","wb");
-
fwrite(&hf,sizeof(char),sizeof(BITMAPFILEHEADER),outfile);
-
fwrite(&hInfo,sizeof(char),sizeof(BITMAPINFOHEADER),outfile);
-
fwrite(hRGB,sizeof(RGBQUAD),256,outfile);
-
fwrite(OutImg,sizeof(char),hInfo.biSizeImage,outfile);
-
fclose(outfile);
-
-
-
// 메모리 해제
-
delete []lpImg;
-
-
}
'컴퓨터 과학 & 영상처리 관련 > 그래픽스' 카테고리의 다른 글
iteraced scan 비월주사 ( 아날로그 주사방식 ) (0) | 2012.05.09 |
---|---|
순방향 사상, 역방향 사상 (0) | 2012.05.09 |
일반 좌표계와 영상 좌표계에서의 y축의 값 (0) | 2012.05.02 |
120502 엑셀에서 high order interpolation (고등차수 보간법) (0) | 2012.05.02 |
흑화소들의 무게중심 구하는 방법(무게중심 구하고 십자선 긋기) (0) | 2012.04.18 |