728x90
728x90
영상처리를 위해 C언어를 사용해야 하는데 복습 한번 쓱 합시다.
1 byte = 8 bit
2^8 = 256 이라고 생각하면 편합니당
256*256 = 65536
malloc과 calloc이 있죠
free를 생활화 합시다!
우린 영상처리를 할꺼니까 이진 파이링 되겠네요
file 포인터 사용하는거 잘 봐야합니당
scanf에는 주소 기호 사용하는 것도 잊지 말고여
상대 경로와 절대 경로 잘 지켜야 합니다.
파일에서 데이터를 가지고 온다고 생각하면 편합니다.
파일에 작성한다고 생각하면 됩니당
그럼 실습 하나를 해봐야겠죠
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
int main() {
BITMAPFILEHEADER bmpFile;
BITMAPINFOHEADER bmpInfo;
FILE* inputFile = NULL;
inputFile = fopen("AICenter.bmp", "rb");
fread(&bmpFile, sizeof(BITMAPFILEHEADER), 1, inputFile);
fread(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, inputFile);
int width = bmpInfo.biWidth;
int height = bmpInfo.biHeight;
int size = bmpInfo.biSizeImage;
int bitCnt = bmpInfo.biBitCount;
int stride = (((bitCnt / 8) * width) + 3) / 4 * 4;
printf("%d %d %d %d %d\n",width,height,size,bitCnt,stride);
unsigned char* inputImg = NULL, * outputImg = NULL;
inputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
outputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
fread(inputImg, sizeof(unsigned char), size, inputFile);
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
outputImg[j * stride + 3 * i + 0] = inputImg[j * stride + 3 *i + 0];
outputImg[j * stride + 3 * i + 1] = inputImg[j * stride + 3 * i + 1];
outputImg[j * stride + 3 * i + 2] = inputImg[j * stride + 3 * i + 2];
if (i < 100 && j < 100) {
outputImg[j * stride + 3 * i + 0] = 0;
outputImg[j * stride + 3 * i + 1] = 255;
outputImg[j * stride + 3 * i + 2] = 0;
}/*
if (i > 400 && j > 400) {
outputImg[j * stride + 3 * i + 0] = 255;
outputImg[j * stride + 3 * i + 1] = 0;
outputImg[j * stride + 3 * i + 2] = 0;
}
if (i < 100 && j > 400) {
outputImg[j * stride + 3 * i + 0] = 0;
outputImg[j * stride + 3 * i + 1] = 0;
outputImg[j * stride + 3 * i + 2] = 255;
}
if (i > 400 && j < 100) {
outputImg[j * stride + 3 * i + 0] = 0;
outputImg[j * stride + 3 * i + 1] = 0;
outputImg[j * stride + 3 * i + 2] = 0;
}*/
}
}
FILE* outputFile = fopen("Output.bmp", "wb");
fwrite(&bmpFile, sizeof(BITMAPFILEHEADER),1,outputFile);
fwrite(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, outputFile);
fwrite(outputImg, sizeof(unsigned char), size, outputFile);
free(outputImg);
free(inputImg);
fclose(outputImg);
fclose(inputFile);
return 0;
}
저기 코드에 따라 다양한 영상의 변환이 가능합니다.
위 코드로 부터 왼쪽 아래에서 0,0으로 시작한 다는 것을 알았다.
그리고 색상한 BGR 순서이다.
728x90
'언어 > C' 카테고리의 다른 글
c언어 복습 - 입력, python도 조금 (0) | 2024.03.22 |
---|---|
C언어 영상처리 - 과제 1 (0) | 2024.03.20 |
함수를 가리키는 포인터, 보이드 포인터(void *) (1) | 2023.11.17 |
포인터를 가리키는 포인터 (1) | 2023.11.17 |
정수형(8 bits) 16진수 변환 (1) | 2023.11.17 |