728x90
728x90
edge는 명암, 휘도 등이 급격하게 변하는 곳 입니다.
만약 물체가 동일한 색 이라면 경계의 색 차이가 크게 나지 않겠지요 ..
그래도 색 차이가 큰 곳에서는 대부분 경계가 잘 드러납니다.
x,y에 대한 기울기를 통해 구할 수 있습니다.
우리는 영상을 사용하므로 딱딱 끊어져 있으므로 center를 통해 구할 수 있습니다.
임계값보다 크면 edge로 판단할 수 있는데 이 임계값이 문제네요
threshold값을 보면 엄청 작은 것을 알 수 있다.
threshold값을 넘는 것을 edge로 보고 확실하게 표시하도록 하겠다.
오............ㅠ......
엣지를 잘 따는 것 같기는 한데....
노이즈가 슬슬 끼네요....
어우 무섭네...
원본 edge가 이정도인걸 보면 그래도 많이 살렸네요
흠....
이건 그래도 저장 했으니까..
나중에 쓸모 있겠네요
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
'언어 > C' 카테고리의 다른 글
C언어 영상처리 - 노이즈 제거, 업스케일링 기록용 (1) | 2024.05.16 |
---|---|
C 언어 영상처리 - Sobel Filter, 윤곽선 검출, Edge Detection (0) | 2024.05.07 |
C언어 영상처리 - Rotation (0) | 2024.04.30 |
C언어 영상처리 최종 정리 - filter, padding, upsampling (1) | 2024.04.18 |
C언어 영상 처리 - Gamma (1) | 2024.04.18 |