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
'언어 > C' 카테고리의 다른 글
C 언어 영상처리 과제 3 - HE를 통해 선명한 사진 얻기 (0) | 2024.04.09 |
---|---|
C언어 영상처리 - Histogram Equalization (0) | 2024.04.04 |
C언어 영상처리 - padding, filters (0) | 2024.03.28 |
영상처리 과제 2 - PSNR 구하기 (0) | 2024.03.28 |
c언어 복습 - 입력, python도 조금 (0) | 2024.03.22 |