언어/C

C언어 영상처리 Edge 구하기, threshold 구하기

이게될까 2024. 5. 2. 23:21
728x90
728x90

edge는 명암, 휘도 등이 급격하게 변하는 곳 입니다.

만약 물체가 동일한 색 이라면 경계의 색 차이가 크게 나지 않겠지요 ..

그래도 색 차이가 큰 곳에서는 대부분 경계가 잘 드러납니다.

x,y에 대한 기울기를 통해 구할 수 있습니다.

우리는 영상을 사용하므로 딱딱 끊어져 있으므로 center를 통해 구할 수 있습니다.

임계값보다 크면 edge로 판단할 수 있는데 이 임계값이 문제네요

x
y
x+y한 이미지
원본 히스토그램
엣지 히스토
원본
노이즈 이미지
노이즈 이미지 median 필터 후 x
필터 후 y
x+y

threshold값을 보면 엄청 작은 것을 알 수 있다.

threshold값을 넘는 것을 edge로 보고 확실하게 표시하도록 하겠다.

0.99

오............ㅠ......

엣지를 잘 따는 것 같기는 한데....

0.98

노이즈가 슬슬 끼네요....

0.97

어우 무섭네...

원본 edge가 이정도인걸 보면 그래도 많이 살렸네요

0.96

흠....

이건 그래도 저장 했으니까..

나중에 쓸모 있겠네요

void edgeMap(double* y, int width, int height, BITMAPFILEHEADER bmpFile, BITMAPINFOHEADER bmpInfo, double* edgey) {
	//padding
	int padding = 2, pwidth = width + padding * 2, pheight = height + padding * 2, psize = pwidth * pheight;
	double* py, * xy, * yy, * outy, filter[] = {-1,0,1},sumf = 0;
	py = (double*)calloc(pwidth * pheight, sizeof(double));
	xy = (double*)calloc(width * height, sizeof(double));
	yy = (double*)calloc(width * height, sizeof(double));
	outy = (double*)calloc(width * height, sizeof(double));

	//getPadding(py,height,width, padding, pheight, pwidth, y2);
	//applyPadding(py, height, width, padding, y2);
	applyPaddingWithAverage(py, height, width, padding, y);

	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			sumf = 0;
			for (int k = 0; k < 3; k++) {
				sumf += filter[k] * py[(j) * pwidth + (i + k)];
			}
			xy[j * width + i] = sumf;

		}
	}
	makeOutFile(bmpFile, bmpInfo, "xEdgeOut.bmp", xy);
	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			sumf = 0;
			for (int k = 0; k < 3; k++) {
				sumf += filter[k] * py[(j+k)*pwidth + (i)];
			}
			yy[j * width + i] = sumf;

		}
	}
	makeOutFile(bmpFile, bmpInfo, "yEdgeOut.bmp", yy);
	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			outy[j * width + i] = sqrt(xy[j * width + i]* xy[j * width + i]+yy[j * width + i]*yy[j * width + i]);
		}
	}

	CumulativeHisto(height, width, outy, bmpInfo.biSizeImage, (((bmpInfo.biBitCount / 8) * width) + 3) / 4 * 4, bmpFile, bmpInfo);
	printf("threshold= %f\n", threshold);
	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			if (outy[j * width + i] > threshold) edgey[j * width + i] = 254;
		}
	}
	makeOutFile(bmpFile, bmpInfo, "EdgeOut.bmp", outy);
	makeOutFile(bmpFile, bmpInfo, "thresholdEdge.bmp", edgey);
	free(py);
	free(xy);
	free(yy);
	free(outy);

}
728x90