라즈베리파이에서 Processing을 이용한 영상처리- 영역처리(3)

메카 2017-04-18 (화) 10:55 1년전 1012  

3) Laplaceian of Gaussian(LOG)

 

LOG 연산자는 가우시안 스무딩 필터링을 먼저 수행하고 그 결과 값에 Laplacian (에지 강조)을 수행하는 것이다.

 

a) 소스코드 및 결과 영상

 PImage img;

double[][] LaplaceOfGaussianlMask = {{0.0, 0.0, -1.0, 0.0, 0.0},

{0.0, -1.0, -2.0, -1.0, 0.0},

{-1.0, -2.0, 16.0, -2.0, -1.0},

{0.0, -1.0, -2.0, -1.0, 0.0},

{0.0, 0.0, -1.0, 0.0, 0.0}};

void setup() {

img=loadImage("Lena.JPG");

size(512, 256);

}

 

void draw() {

PImage img_LaplaceOfGaussian = createImage( img.width, img.height, RGB );

 

image(img, 0, 0);

img.loadPixels();

for ( int y = 2; y < img.height-2; y++) {

for ( int x = 2; x < img.width-2; x++) {

float S=0.0;

for (int i = -2; i <= 2; i++) {

for (int j = -2; j <=2; j++) {

int pos = (x+j) + (y+i)*img.width;

float val = red(img.pixels[pos]);

S += LaplaceOfGaussianlMask[i+2][j+2]*val;

}

}

if(S>255.0) S=255.0;

if(S<0.0) S=0.0;

img_LaplaceOfGaussian.pixels[x + y*img.width]=color(S,S,S);

}

}

img_LaplaceOfGaussian.updatePixels();

image(img_LaplaceOfGaussian, 256, 0);

}

 

 

51bf74f7783ee53843ce3bb5ed2dd15c_1492480 

그림 7-10. LoG 소스 코드 및 결과 영상

 

 

b) 코드 설명

convolution 마스크가 Gaussian 모양이 나와야 하므로 크기는 5x5를 사용하였다. 나머지는 Laplacian과 같은 처리 과정을 가진다.

  

 

4) Difference of Gaussian(DoG)

LOG 연산자의 단점을 보완해서 나온 것이 DoG이다. LoG의 단점은 계산 시간이 많이 소요되는 것이다. 각 가우시안 연산에 분산값을 서로 다르게 주어 이 차를 이용해 에지 맵을 구하는 것이다. 사용되어지는 식은 아래와 같다

 

 

51bf74f7783ee53843ce3bb5ed2dd15c_1492480

 

 

σ1과 σ2 값을 변화시켜 검출할 에지 넓이를 조절할 수 있음.σ1/σ2 = 1.6일 경우의 비율이 LoG와 가장 비슷한 결과를 나타낸다.

 

a) 소스코드 및 결과 영상

 PImage img;

double[][] DifferenceOfGaussianlMask = {{0.0, 0.0, -1.0, -1.0, -1.0, 0.0, 0.0},

{0.0, -2.0, -3.0, -3.0, -3.0, -2.0, 0.0},

{-1.0, -3.0, 5.0, 5.0, 5.0, -3.0, -1.0},

{-1.0, -3.0, 5.0, 16.0, 5.0, -3.0, -1.0},

{-1.0, -3.0, 5.0, 5.0, 5.0, -3.0, -1.0},

{0.0, -2.0, -3.0, -3.0, -3.0, -2.0, 0.0},

{0.0, 0.0, -1.0, -1.0, -1.0, 0.0, 0.0}};

void setup() {

img=loadImage("Lena.JPG");

size(512, 256);

}

void draw() {

PImage img_DifferenceOfGaussian = createImage( img.width, img.height, RGB );

image(img, 0, 0);

img.loadPixels();

for ( int y = 3; y < img.height-3; y++) {

for ( int x = 3; x < img.width-3; x++) {

float S=0.0;

for (int i = -3; i <= 3; i++) {

for (int j = -3; j <=3; j++) {

int pos = (x+j) + (y+i)*img.width;

float val = red(img.pixels[pos]);

S += DifferenceOfGaussianlMask[i+3][j+3]*val;

}

}

if(S>255.0) S=255.0;

if(S<0.0) S=0.0;

img_DifferenceOfGaussian.pixels[x + y*img.width]=color(S,S,S);

}

}

img_DifferenceOfGaussian.updatePixels();

image(img_DifferenceOfGaussian, 256, 0);

}

 

 

51bf74f7783ee53843ce3bb5ed2dd15c_1492480

 

그림 7-11 소스 코드 및 결과 영상

 

 

 

 


모바일 버전으로 보기