2차 Derivative에 따른 edge 검출

  • f''(x) = f(x+1) - 2f(x) + f(x-1)
  • zero corssing : Marr-Hildreth 검출 -> 0을 중심으로 부호가 바뀜
  • Laplacian mask필터 마스크에 의한 검출
    • Laplacian operation은 n 차원 유클리드 공간에서 2 차 미분 연산자

 


Canny edge

  • 최소오류율 : 거짓 긍정(edge가 아닌데 edge라고 판단), 거짓 부정(edge인데 edge가 아니라고 판단)이 최소여야함
  • 위치정확도 : edge위치가 pixel상에 좀 다르게 검출
  • edge두께 : 가능한 가늘게 검출해야함
  • Canny edge 검출 알고리즘
    • 입력 영상 f에 σ크기의 가우시안 스무딩을 적용

 

    • 결과 영상에 소벨 연산자를 적용하여 edge강도와 edge방향 맵을 구함

    • 비최대 억제를 적용하여 얇은 두께 edge 맵을 만듦 : 최대가 아닌 것 삭제
    • 이력 임계값을 적용하여 거짓 긍정을 제거
      1. Hysteresis Treshhold를 사용하여 필요없는 edge를 제거 - 이웃하는 pixel이 edge이면 낮거나 높아도 edge로 판단
      2. Hough Transform : 매우 손상된 선이나 곡선을 감지 할 수 있음
  • Hysteresis Treshhold 그래프

 

  • Hough Transform의 필요성

 

  • Hysteresis Treshhold 적용 예제

 

 

  • Hough Transform 수행 예

 

이미지 노이즈 씌우기

 

1. Pepper and salt noise

 

 

1
2
3
origin = imread('Matlab_Image/lenna.jpg');
PSnoise = imnoise(origin,'salt & pepper');
imshow(PSnoise);
cs

 

2. Gaussian noise

 

 

1
2
3
origin = imread('Matlab_Image/lenna.jpg');
Gnoise = imnoise(origin,'gaussian');
imshow(Gnoise);
cs

  

노이즈 이미지 복원

 

1. Restore Pepper and salt noise

 

 

1
2
R_PSnoise = medfilt2(PSnoise);
imshow(R_PSnoise);
cs

   

2. Restore Gaussian noise

 

 

1
2
3
4
5
6
7
8
s = size(origin);
t_gq10 = zeros(s(1),s(2),10);
for i=1:10 
    t_ga10(:,:,i)=imnoise(origin,'gaussian'); 
end
t_ga10_av=mean(t_ga10,3); 
t_ga10_av=uint8(t_ga10_av);
imshow(t_ga10_av);
cs

 

결과

 

1. 복원 이미지와 원본 이미지 비교

 

1) Pepper and salt noise

 

 

1
2
3
4
5
6
subplot(1,2,1);
imshow(origin);
title('Origin');
subplot(1,2,2);
imshow(R_HSnoise);
title('Restore Peper&Salt noise');
cs
 

2) Gaussian noise

 

1
2
3
4
5
6
 subplot(1,2,1);
 imshow(origin);
 title('Origin');
 subplot(1,2,2);
 imshow(t_ga10_av);
 title('Restore Gaussian noise');
cs

 

2. 원본 이미지와의 PSNR 계산

>직접 작성한 코드와 Matlab 라이브러리 결과 비교

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function PSNR = MY_PSNR(origin,second)
    origin = double(origin);
    second = double(second);
    
    m=length(origin(1,:)); %세로 길이
    n=length(origin(:,1)); %가로 길이
    temp = 0;
 
    for i=1:m
        for j=1:n
            temp = temp + (origin(i,j) - second(i,j))^2;
        end
    end
    
    MSE = temp/(m*n);
    
    PSNR = 20*log10(255/sqrt(MSE));
    
end
cs

 

1) 작성한 PSNR 계산 함수2) Matlab 라이브러리와 결과 비교 Pepper&Salt noise

 

1
2
MYPSNR = MY_PSNR(origin,PSnoise) %내가 만든 함수
LIBPSNR = psnr(origin,PSnoise) %매트랩 라이브러리 함수
cs

 

 

 

3) Matlab 라이브러리와 결과 비교 Gaussian noise

 

1
2
MYPSNR = MY_PSNR(origin,t_ga10_av) %내가 만든 함수
LIBPSNR = psnr(origin,t_ga10_av) %매트랩 라이브러리 함수
cs

 

 

 

 

엣지 검출 알고리즘

 

1. 소벨 엣지(직접 구현)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%% 소벨 엣지 구현
clear; clc;
origin = imread('Matlab_Image/house.jpg');
 
SBMx = [-1 0 1;-2 0 2;-1 0 1]; %수직
SBMy = [-1 -2 -1;0 0 0;1 2 1]; %수평
 
%h = fspecial('gaussian',[5 5]);
 
originA = imgaussfilt(origin);
 
SBIv = abs(filter2(SBMx,originA));
SBIh = abs(filter2(SBMy,originA));
 
SBIS = SBIv + SBIh;
 
imshow(SBIS/255>0.7); %threshold
cs

 

2. 소벨 엣지(Matlab 라이브러리)

 

1
figure,imshow(edge(origin,'sobel'));
cs

 

3. 케니 엣지(Matlab 라이브러리)

 

1
figure, imshow(edge(origin,'canny'));
cs

 

결과

 

1. 결과 이미지 비교

  • Sobel mask

  • Canny edge

 

2. 시간 비교

  • MYsobel

  • LIBsobel

 

'영상처리 실습' 카테고리의 다른 글

[Opencv]여러가지 프로세싱 알고리즘 구현  (0) 2018.12.11
matlab wavelets toolbox  (0) 2018.12.06

+ Recent posts