[컴퓨터 비전] - 가우시안 함수를 미분한 마스크를 통한 에지검출[컴퓨터 비전] - 가우시안 함수(Gaussian)를 미분한 마스크를 통한 에지검출
가우시안 스무딩 연산을 수행하고, 미분연산자에 의한 에지검출 연산은 매우 많은 계산량을 필요로 한다. 그래서 스무딩함수인 가우시안 함수에 대한 미분연산을 먼저 수행한 후, 입력영상과 콘볼루션 처리함으로써 계산시간을 줄이는 것이 효율적이다.
oid CMFCtestDoc::OnDerivativeofgaussian()
{
// TODO: 여기에명령처리기코드를추가합니다.
const double PI = 3.14159;
const double sigma = 5.0; // Gaussian 분포의표준편차, sigma =0.4, 1.0, 2.0
int y, x, r, c;
int M = (int)(6.0 * sigma) + 1; // 마스크크기M x M
if (M % 2 == 0) M = M + 1; // 마스크의크기M 짝수이면홀수로만든다.
int center = (int)M / 2; // 마스크의중심
int scale = 10; // 마스크의전체가중치를Scaling 하는변수
int amplitude; // 에지강의크기를저장
//X, Y 마스크를위한메모리크기할당
double **MaskX = new double*[M];
double **MaskY = new double*[M];
for (int i = 0; i < M; i++) {
MaskX[i] = new double[M];
MaskY[i] = new double[M];
}
//[1] 가우시안함수를미분한X 축, Y 축마스크계산
for (y = -center; y <= center; y++) {
for (x = -center; x <= center; x++) {
MaskX[y + center][x + center] = scale * (-x * exp(-(x * x + y * y) / (2.0 *
sigma * sigma)) / (2.0 * PI * sigma * sigma * sigma * sigma));
MaskY[y + center][x + center] = scale * (-y * exp(-(x * x + y * y) / (2.0 *
sigma * sigma)) / (2.0 * PI * sigma * sigma * sigma * sigma));
}
}
for (y = 0; y < height; y++)for (x = 0; x < width; x++)m_OutImage[y*width + x] = 0;
// [2] 마스크를이용한에지강도검출
for (y = center; y < height - center; y++) {
for (x = center; x < width - center; x++) {
int sumX = 0;
int sumY = 0;
for (r = 0; r < M; r++) {
for (c = 0; c < M; c++) {
sumX += MaskX[r][c] * m_InImage[(y + r - (int)(M / 2))*width + x + c - (int)(M / 2)];
sumY += MaskY[r][c] * m_InImage[(y + r - (int)(M / 2))*width + x + c - (int)(M / 2)];
}
}
//에지강도값계산
amplitude = (int)sqrt((double)sumX * sumX + sumY * sumY);
// 에지강도값을0 ~ 255로처리(clipping)
if (amplitude > 255) m_OutImage[y*width + x] = 255;
else if (amplitude < 0) m_OutImage[y*width + x] = 0;
else m_OutImage[y*width + x] = (unsigned char)amplitude;
}
}
delete[] MaskX;
delete[] MaskY;
UpdateAllViews(NULL);
}
실행 화면)
소감) 가우시안 함수를 미분한 마스크를 통해 에지를 검출하면 계산 시간도 줄일 수 있고 다양한 표준편차를 사용해 영상을 비교해 볼 수도 있었다. 표준편차를 2.0과 같은 값으로 주면 적당한 블러 처리를 할 수 있지만 5.0과 같이 높은 값으로 주면 영상 전부가 블러 처리되어 보이지 않는다는 것을 확인했다. 이를 openCV를 통해 실습해 본다면 함수를 이용하여 더 빠르게 실습을 할 수 있을 것 같다.
'끄적끄적_공부' 카테고리의 다른 글
[컴퓨터활용능력1급] - 실기 시험 / 시험 후기 (0) | 2020.05.25 |
---|---|
도메인 이름을 이용해 IP주소 받기 (2) | 2020.04.14 |
[리눅스 환경 설정] - visual studio code/echo (6) | 2020.04.13 |
[컴퓨터 비젼] - MFC/ openCV /히스토그램을 이용한 영상 이진화 처리 (0) | 2020.04.03 |
[컴퓨터 비젼] - openCV/MFC를 이용한 영상신호처리 (4) | 2020.03.30 |