언어/C

C언어 영상처리 - 과제 1

이게될까 2024. 3. 20. 13:27
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