728x90
728x90
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
int main() {
BITMAPFILEHEADER bmpFile, bmpFile2;
BITMAPINFOHEADER bmpInfo, bmpInfo2;
FILE* inputFile = NULL, * inputFile2 = NULL;
inputFile = fopen("AICenter.bmp", "rb");
inputFile2 = fopen("MASK.bmp", "rb");
fread(&bmpFile, sizeof(BITMAPFILEHEADER), 1, inputFile);
fread(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, inputFile);
fread(&bmpFile2, sizeof(BITMAPFILEHEADER), 1, inputFile2);
fread(&bmpInfo2, sizeof(BITMAPINFOHEADER), 1, inputFile2);
int width = bmpInfo.biWidth;
int height = bmpInfo.biHeight;
int size = bmpInfo.biSizeImage;
int bitCnt = bmpInfo.biBitCount;
int stride = (((bitCnt / 8) * width) + 3) / 4 * 4;
double Y, Cb, Cr,*y,*cb,*cr,*y2;
printf("%d %d %d %d %d\n",width,height,size,bitCnt,stride);
int width2 = bmpInfo2.biWidth;
int height2 = bmpInfo2.biHeight;
int size2 = bmpInfo2.biSizeImage;
int bitCnt2 = bmpInfo2.biBitCount;
int stride2 = (((bitCnt2 / 8) * width2) + 3) / 4 * 4;
printf("%d %d %d %d %d\n", width2, height2, size2, bitCnt2, stride2);
unsigned char* inputImg = NULL, * outputImg = NULL,* I, * inputImg2 = NULL;
inputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
inputImg2 = (unsigned char*)calloc(size, sizeof(unsigned char));
outputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
y = (double*)calloc(width* height, sizeof(double));
y2 = (double*)calloc(width * height, sizeof(double));
cb = (double*)calloc(width * height, sizeof(double));
cr = (double*)calloc(width * height, sizeof(double));
I = (unsigned char*)calloc(width * height, sizeof(unsigned char));
fread(inputImg, sizeof(unsigned char), size, inputFile);
fread(inputImg2, sizeof(unsigned char), size, inputFile2);
// input
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
y[j * width + i] = 0.299 * inputImg[j * stride + 3 * i + 2] + 0.587 * inputImg[j * stride + 3 * i + 1] + 0.114 * inputImg[j * stride + 3 * i + 0];
//cb[j * width + i] = -0.169 * inputImg[j * stride + 3 * i + 2] - 0.331 * inputImg[j * stride + 3 * i + 1] + 0.500 * inputImg[j * stride + 3 * i + 0];
//cr[j * width + i] = 0.500 * inputImg[j * stride + 3 * i + 2] - 0.419 * inputImg[j * stride + 3 * i + 1] - 0.0813 * inputImg[j * stride + 3 * i + 0];
//y[j * width + i] += 120;
I[j * width + i] = (unsigned char)((inputImg[j * stride + 3 * i + 2] + inputImg[j * stride + 3 * i + 1] + inputImg[j * stride + 3 * i + 0]) / 3);
y2[j * width + i] = 0.299 * inputImg2[j * stride + 3 * i + 2] + 0.587 * inputImg2[j * stride + 3 * i + 1] + 0.114 * inputImg2[j * stride + 3 * i + 0];
}
}
// Algorithm
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
//printf("%.1f ", y[j * width + i]);
//y2[j * width + i] /= 255;
//if (y2[j * width + i] == 0) y2[j * width + i] = 0;
//else y2[j * width + i] = 1;
y[j * width + i] = (y[j * width + i]*0.2+y2[j * width + i]*0.8);
}
//printf("\n");
}
// output
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
outputImg[j * stride + 3 * i + 0] = (unsigned char)(y[j * width + i]>255 ? 255 : (y[j * width + i]< 0 ? 0 : y[j * width + i]));
outputImg[j * stride + 3 * i + 1] = (unsigned char)(y[j * width + i] > 255 ? 255 : (y[j * width + i] < 0 ? 0 : y[j * width + i]));
outputImg[j * stride + 3 * i + 2] = (unsigned char)(y[j * width + i] > 255 ? 255 : (y[j * width + i] < 0 ? 0 : y[j * width + i]));
}
}
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);
fclose(outputFile);
free(outputFile);
free(inputImg);
free(inputImg2);
free(y);
free(cb);
free(cr);
free(I);
free(y2);
fclose(inputFile);
free(inputFile);
return 0;
}
일단 코드부터 뿌리고
이런 사진을
요 동그란 원과 합치는게 과제였습니다.
이건 깔끔하게 잘 되었는데
여기 보면 원 외곽이 이상하게 나오는 것 때문에 코드를 if else if에서 if else로 수정했습니다.
외곽이 깔끔해졌지만 해상도 때문인지 원이 깔끔하지는 않네요
728x90
'언어 > C' 카테고리의 다른 글
영상처리 과제 2 - PSNR 구하기 (0) | 2024.03.28 |
---|---|
c언어 복습 - 입력, python도 조금 (0) | 2024.03.22 |
오랜만에 C언어 복습 (1) | 2024.03.12 |
함수를 가리키는 포인터, 보이드 포인터(void *) (1) | 2023.11.17 |
포인터를 가리키는 포인터 (1) | 2023.11.17 |