언어/C

C언어 영상처리 - Histogram

이게될까 2024. 4. 2. 19:31
728x90
728x90

히스토그램을 통해 우린 픽셀 민감도의 분포를 표현할 수 있다.

분포를 보고 우린 segmentation할 수 있다.

thresholding을 통해 일정 부분 이상의 위치를 볼 수 있고, 그 부분만 필터를 취할 수 있다.

AI가 나오면서 한번에 가능해졌지만 일단 수업이므로...

코드는 전부 함수화를 하였다.

void histo(int height, int width, double* y, int size,int stride, BITMAPFILEHEADER bmpFile, BITMAPINFOHEADER bmpInfo) {
	double* histogram;
	histogram = (double*)calloc(256, sizeof(double));

	// get Histogram
	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			histogram[(unsigned char)(y[j * width + i] > 255 ? 255 : (y[j * width + i] < 0 ? 0 : y[j * width + i]))]++;
		}
	}
	// out Histogram
	double histoMax = 0;
	for (int i = 0; i < 256; i++) {
		if (histogram[i] > histoMax) histoMax = histogram[i];
	}
	for (int i = 0; i < 256; i++)histogram[i] = histogram[i] / histoMax * 230;
	unsigned char* outHisto;
	outHisto = (unsigned char*)calloc(size, sizeof(unsigned char));

	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			if (histogram[i / 2] > j) continue;
			outHisto[j * stride + 3 * i + 0] = 255;
			outHisto[j * stride + 3 * i + 1] = 255;
			outHisto[j * stride + 3 * i + 2] = 255;
		}
	}
	FILE* outputHisto = fopen("OutHisto.bmp", "wb");
	fwrite(&bmpFile, sizeof(BITMAPFILEHEADER), 1, outputHisto);
	fwrite(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, outputHisto);
	fwrite(outHisto, sizeof(unsigned char), size, outputHisto);
	free(histogram);
	fclose(outputHisto);
	free(outHisto);
}

원본
원본 히스토그램

패딩 함수 이렇게 고치면 짧아지는데 내가 알아보기 어려워서 사용하진 않을듯...

void getPadding(double* py, int height, int width, int padding, int pheight, int pwidth, double* y2) {
    // 원본 이미지에 패딩을 추가하여 py에 저장
    for (int j = 0; j < pheight; j++) {
        for (int i = 0; i < pwidth; i++) {
            // 원본 이미지의 범위 내에서는 원본 데이터를, 그 외에는 가장자리 값을 사용
            int x = (i < padding) ? 0 : (i >= width + padding) ? width - 1 : i - padding;
            int y = (j < padding) ? 0 : (j >= height + padding) ? height - 1 : j - padding;
            py[j * pwidth + i] = y2[y * width + x];
        }
    }
    
    // 모서리 처리를 위해 반복문이 아닌 직접 할당
    // 좌하
    for (int j = 0; j < padding; j++) {
        for (int i = 0; i < padding; i++) {
            py[j * pwidth + i] = y2[0];
        }
    }
    // 우하
    for (int j = 0; j < padding; j++) {
        for (int i = 0; i < padding; i++) {
            py[j * pwidth + (pwidth - padding + i)] = y2[width - 1];
        }
    }
    // 좌상
    for (int j = 0; j < padding; j++) {
        for (int i = 0; i < padding; i++) {
            py[(pheight - padding + j) * pwidth + i] = y2[(height - 1) * width];
        }
    }
    // 우상
    for (int j = 0; j < padding; j++) {
        for (int i = 0; i < padding; i++) {
            py[(pheight - padding + j) * pwidth + (pwidth - padding + i)] = y2[height * width - 1];
        }
    }
}

 

728x90