디지털 이미지 처리 - LOG 연산 자 와 CANNY 연산 자 가장자리 추출 (matlab)

LOG 연산 자 와 CANNY 연산 자 테두리 추출
  • 가장자리 의 의미: 디지털 이미지 에서 가장 가장자리 란 이미지 국부 변화 가 가장 현저 한 부분 을 말한다. 가장 자 리 는 주로 목표 와 목표, 목표 와 배경 사이 에 존재 하고 이미지 국부 특성의 불 연속 성 이다. 예 를 들 어 그 레이스 케 일의 돌변, 무늬 구조의 돌변, 안색 의 돌변 등 이다.비록 이미지 의 가장자리 점 이 발생 하 는 원인 이 각각 다 르 지만 그들 은 모두 도형 상의 그 레이스 케 일이 연속 되 지 않 거나 그 레이스 케 일이 급 격 히 변화 하 는 점 이 고 이미지 의 가장 자 리 는 스텝 모양, 경사 모양 과 지붕 모양 으로 나 뉜 다.
  • 일반 이미지 변두리 검 측 방법 은 주로 다음 과 같은 네 가지 절차 가 있다.대부분의 필터 가 소음 을 낮 추 는 동시에 가장자리 강도 의 손실 을 초래 하기 때문에 가장자리 강화 와 소음 감소 사이 에 절충 적 인 선택 이 필요 하 다 는 점 을 지적 해 야 한다.* 61656 이미지 강화: 가장자리 강화 의 기 초 는 이미지 각 점 인접 지역 의 강도 변화 치 를 확정 하 는 것 입 니 다.증강 알고리즘 은 인접 지역 (또는 부분) 의 강도 값 을 현저하게 변화 시 키 는 점 을 돋 보이 게 할 수 있다.가장자리 강 화 는 일반적으로 경사도 의 진폭 을 계산 하여 이 루어 진다.* 61656 이미지 검 측: 이미지 에서 많은 점 의 경사도 폭 이 비교적 크 고 이런 점 들 은 특정한 응용 분야 에서 모두 가장자리 가 아니 므 로 특정한 방법 으로 어떤 점 이 가장자리 점 인지 확인 해 야 합 니 다.가장 간단 한 가장자리 검 측 판단 근 거 는 경사도 진폭 이다. 이미지 포 지 셔 닝: 만약 에 특정한 응용 장소 에서 가장자리 위 치 를 확인 하 라 고 요구 하면 가장자리 의 위 치 는 서브 픽 셀 해상도 에서 평가 할 수 있 고 가장자리 의 방향 도 평가 할 수 있다.
  • LOG 변두리 검 측 연산 자 는 1970 년대 에 Marr 이론 은 신경 생리학 실험 에 따라 다음 과 같은 결론 을 내 렸 다. 물체 의 경 계 는 밝기 이미지 와 그 해석 을 연결 시 키 는 가장 중요 한 단서 이다.변두리 검 측 기술 은 그 당시 에 아주 작은 이웃 지역 의 볼 륨 을 바탕 으로 특수 이미지 에 만 효과 가 좋 았 다.이러한 가장자리 검사 자의 주요 단점 은 물체 의 크기 에 의존 하고 소음 에 민감 하 다 는 것 이다.2 단계 도체 가 0 점 을 넘 는 가장자리 검 측 기술 을 바탕 으로 스텝 가장자리 가 이미지 함수 의 가 파 른 변화 에 대응 한 다 는 사실 을 탐구 했다.이미지 함수 의 1 단계 도 수 는 이미지 가장자리 에 대응 하 는 위치 에서 극치 를 얻어 야 하기 때문에 2 단계 도 수 는 같은 위치 에서 0 이 어야 한다.영점 위 치 를 찾 은 것 은 극치 보다 쉽 고 정확 하 다.관건 적 인 문 제 는 어떻게 2 단계 도 수 를 안정 적 으로 계산 하 느 냐 하 는 것 이다. 한 가지 가능성 은 먼저 부 드 러 운 이미지 (소음 감소) 를 한 다음 에 2 단계 도 수 를 계산 하 는 것 이다.부 드 러 운 필 터 를 선택 할 때 두 가지 기준 을 만족 시 켜 야 합 니 다.『 61656 』 공간 포 지 셔 닝 의 제약 조건 은 필터 의 응답 이 그림 에서 가 까 운 점 에서 나 옵 니 다.이 두 가지 기준 은 모순 되 지만 고 스 분 포 를 사용 하여 동시에 최적화 할 수 있다.실천 에서 최적화 의 의 미 를 정확하게 고려 해 야 한다.Laplacian 연산 자 를 선택 하 는 기 초 는 두 가지 기본 개념 이 있다.첫째, 산 자의 고 스 부분 은 이미 지 를 모호 하 게 하여 사이즈 에 있어 구조의 그 레이스 케 일 (소음 포함) 을 훨씬 작 게 낮 출 수 있다.σ정도, 그리고 고 스 함 수 는 공간 과 주파수 두 도 메 인 에서 부 드 러 운 이미 지 를 도입 할 수 있 기 때문에 원래 이미지 에 존재 하지 않 는 인위적인 간섭 (예 를 들 어 벨) 을 도입 할 가능성 이 적다.둘째, 라 프 라 스 는 각 방향 동성 (회전 이 변 하지 않 음) 의 중요 한 장점 을 가지 고 사람들의 시각 시스템 특성 에 부합 되 며 모든 템 플 릿 방향의 그 레이스 케 일 변화 에 똑 같은 응답 을 하여 여러 템 플 릿 을 사용 하여 이미지 의 모든 점 에서 가장 강 한 응답 을 계산 하 는 것 을 피한다.LOG 알고리즘 절 차 는 다음 과 같 습 니 다.『 61656 』 첫 번 째 그림 을 얻 은 라 프 라 스 를 계산 합 니 다.『 61656 』 단계 2 소득 이미지 의 0 교차 찾기.
  • Canny 변두리 검 측 연산 자 는 1986 년 에 JOHN CANNY 가 좋 은 변두리 검 측 알고리즘 을 제 시 했 는데 Canny 변두리 검 측 기 라 고 불 린 다. Canny 방법 은 세 가지 기본 적 인 목 표를 바탕 으로 한다. 즉, 61656 ℃ 검 측 기준: 낮은 오류 율 이다.모든 가장자리 가 찾 아야 하고 가짜 가장자리 가 없어 야 한다.* 61656 행위 기준: 가장자리 점 은 잘 포 지 셔 닝 되 어야 한다.측 정 된 가장자리 점 과 실제 가장자리 의 중심 사이 의 거 리 는 가장 작 아야 한다.『 61656 』 단일 응답 기준: 단일 한 가장자리 효과.실제 가장자리 점 에 대해 서 는 감지 기 가 한 점 만 되 돌려 야 한다.즉, 실제 가장자리 의 부분 최대 수 는 가장 작 아야 한 다 는 것 이다.단일 가장자리 점 만 존재 한 다 는 뜻 으로 감지 기 는 여러 개의 가장자리 픽 셀 을 지적 해 서 는 안 된다.Canny 테두리 검출 알고리즘 은 기본 적 인 절차 로 구성 되 어 있 습 니 다.직경 61656. 경사도 진폭 이미지 와 각도 이미 지 를 계산 합 니 다.『 61656 』 경사도 진폭 이미지 에 대한 최대 억제 가 아 닙 니 다.『 61656 』 이중 한도 값 처리 와 연결 분석 으로 가장 자 리 를 검 측 하고 연결 합 니 다.
  • 비교 분석 은 61692 ℃ 와 같은 척도 에서 의 LOG 연산 자 는 항상 Canny 연산 자 보다 더 많은 세부 사항 을 검출 할 수 있 고 Canny 연산 자 는 진정 으로 현저 한 가장자리 에 대해 검 측 할 수 있다.LOG 연산 자 는 척도 의 영향 을 받 기 쉬 우 므 로 척도 에 따라 가장자리 점 을 서로 다른 척도 의 LOG 연산 자로 측정 해 야 한다. Canny 연산 자 는 척도 의 영향 을 받 아 뚜렷 하지 않 고 척도 에 따라 가장자리 점 의 위치 가 모두 편차 가 있 지만 거의 같다. 소음 에 대한 민감 도 를 보면 LOG 테두리 검출 자 는 2 단계 도체 가 영점 을 넘 는 검출 방법 을 사용 하기 때문에 소음 에 더욱 민감 하 다. 따라서 소음 을 억제 하 는 측면 에서 Canny 테두리 검출 자 는 소음 의 간섭 을 받 기 쉽 지 않 고 같은 척도 에서 LOG 계산 자 는 소음 의 간섭 을 받 기 쉬 우 며 소음 을 억제 하 는 능력 이 약 하 다.LOG 산 자 는 소음 에 대한 억제 능력 이 척도 가 증가 함 에 따라 증가 하 는데, 같은 척도 에서 의 캐 니 산 자 는 LOG 산 자 보다 소음 방지 능력 이 강하 고, LOG 산 자 는 캐 니 산 자의 가장자리 점 보다 정확 하 다.『 61692 』 약 한 가장자리 에 대해 서 는 Canny 가장자리 검 측 자 는 두 가지 서로 다른 한도 값 으로 강 한 가장자리 와 약 한 가장 자 리 를 검 측 하고 약 한 가장자리 와 강 한 가장자리 가 연 결 될 때 약 한 가장 자 리 를 출력 이미지 에 포함 시 키 기 때문에 Canny 연산 자 는 진정한 약 한 가장 자 리 를 검 측 할 수 있 지만 Canny 가장자리 검 측 자가 검 측 한 가장자리 의 위 치 는 일정한 범위 의 오차 가 있 습 니 다. 가짜 테두리 에 대해 LOG 테두리 검출 자 는 상대 적 으로 소음 방 해 를 받 기 쉬 우 며 더 많은 세부 사항 을 검출 할 수 있 고 소음 으로 인 한 가짜 테두리 도 쉽게 검출 할 수 있 지만 LOG 테두리 검출 자가 가장자리 위치 에 대한 검출 은 정확 하 다.
  • 참고 문헌 [1] D. Marr 와 E. Hildreth, Theory of Edge Detection, Proc. R. Soc. Lond. B207: 187 - 217. [2] John Canny, Edge Detection 에 대한 계산 적 접근 법, IEEE Trans. PAMI, 8 (6): 679 - 698. [3] James J. Clark, Authenticating Edge 제로 교차 알고리즘 으로 제 작 된 인증 에 지, IEEE T. PAMI, 11 (1), 1989, pp. 43 - 57.
  • 부록: 실험 코드
    code: 독립 가성 고 스 백 소음
    function [distImg,endtImg] = add_noise(origImg,u)
    origImg = im2double(origImg);
    distImg = imnoise(origImg, 'gaussian', 0, u);
    endtImg = distImg.*255;
    end
    

    code: 그림 에 고 스 필터 링
    function g=my_gaussian(src,n,k)  
    n1=(n+1)/2;                                         
    [m,l]=size(src);  
    b=zeros(n,n);                                      
    I=zeros(m,l);  
    g=zeros(m,l);  
    img=zeros(m,l);  
    [Ay, Ax ,dim ] = size(src);
    if dim>1
        src = rgb2gray(src);
    end
    for i=1:n  
        for j=1:n  
              b(i,j)=(exp(-((i-n1)^2 +(j-n1)^2)/(2*k)))/(2*pi*k);  
        end  
    end  
    b = b/sum(b(:));        
    I=double(src);  
    img=conv2(I,b,'same');              
    g=uint8(img);    
    end
    

    code: LOG 연산 자 이미지 처리 및 결과 표시
    function [thrr] =log_img(noise,n,k,thr)
    [filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'}, '    ');
    if filename == 0
        return;
    end
    imgsrc = imread([pathname, filename]);
    [y, x, dim] = size(imgsrc);  %       
    if dim>1
        imgsrc = rgb2gray(imgsrc);
    end
    if (x~=256 && y~=256)  %   8bit 256*256  
        imgsrc = im2uint8(imgsrc);
        imgsrc=imresize(imgsrc,[256,256]);
    end
    [showing_noise, img_noise]= add_noise(imgsrc,noise);
    img= my_gaussian(img_noise,n,k); 
    [img_log,thrr]=edge(img,'log',thr);
    figure(1)    
            imshow(imgsrc);%  
    figure(2)  
            imshow(showing_noise);
    figure(3)  
            imshow(img);%     
    figure(4)  
            imshow(img_log);
    end  
    

    code: CANNY 연산 자 실현
    function [ m, theta, sector, canny1,  canny2, bin] = canny_step( src,  lowTh)
    [Ay, Ax, dim ] = size(src);
    if dim>1
        src = rgb2gray(src);
    end
    src = double(src);
    m = zeros(Ay, Ax); 
    theta = zeros(Ay, Ax);
    sector = zeros(Ay, Ax);
    canny1 = zeros(Ay, Ax);
    canny2 = zeros(Ay, Ax);
    bin = zeros(Ay, Ax);
     
    %    
    for y = 1:(Ay-1)
        for x = 1:(Ax-1)
            gx =  src(y, x) + src(y+1, x) - src(y, x+1)  - src(y+1, x+1);
            gy = -src(y, x) + src(y+1, x) - src(y, x+1) + src(y+1, x+1);
            m(y,x) = (gx^2+gy^2)^0.5 ;
            theta(y,x) = atand(gx/gy)  ;
            tem = theta(y,x); 
            if (tem<67.5)&&(tem>22.5)
                sector(y,x) =  0;    
            elseif (tem<22.5)&&(tem>-22.5)
                sector(y,x) =  3;    
            elseif (tem-67.5)
                sector(y,x) =   2;    
            else
                sector(y,x) =   1;    
            end
                
        end    
    end
    
    %      
    for y = 2:(Ay-1)
        for x = 2:(Ax-1)        
            if 0 == sector(y,x) %   -   
                if ( m(y,x)>m(y-1,x+1) )&&( m(y,x)>m(y+1,x-1)  )
                    canny1(y,x) = m(y,x);
                else
                    canny1(y,x) = 0;
                end
            elseif 1 == sector(y,x) %    
                if ( m(y,x)>m(y-1,x) )&&( m(y,x)>m(y+1,x)  )
                    canny1(y,x) = m(y,x);
                else
                    canny1(y,x) = 0;
                end
            elseif 2 == sector(y,x) %   -   
                if ( m(y,x)>m(y-1,x-1) )&&( m(y,x)>m(y+1,x+1)  )
                    canny1(y,x) = m(y,x);
                else
                    canny1(y,x) = 0;
                end
            elseif 3 == sector(y,x) %   
                if ( m(y,x)>m(y,x+1) )&&( m(y,x)>m(y,x-1)  )
                    canny1(y,x) = m(y,x);
                else
                    canny1(y,x) = 0;
                end
            end        
        end
    end
    
    %     
    ratio = 2;
    for y = 2:(Ay-1)
        for x = 2:(Ax-1)        
            if canny1(y,x)ratio*lowTh 
                canny2(y,x) = canny1(y,x);
                bin(y,x) = 1;
                continue;
            else 
                tem =[canny1(y-1,x-1), canny1(y-1,x), canny1(y-1,x+1);
                           canny1(y,x-1),    canny1(y,x),   canny1(y,x+1);
                           canny1(y+1,x-1), canny1(y+1,x), canny1(y+1,x+1)];
                temMax = max(tem);
                if temMax(1) > ratio*lowTh
                    canny2(y,x) = temMax(1);
                    bin(y,x) = 1;
                    continue;
                else
                    canny2(y,x) = 0;
                    bin(y,x) = 0;
                    continue;
                end
            end
        end
    end
    end
    

    code: CANNY 이미지 처리 및 결과 전시
    function  canny_plotimg(noise,n,thr,k)
    [filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'}, '    ');
    if filename == 0
        return;
    end
    imgsrc = imread([pathname, filename]);
    [y, x, dim] = size(imgsrc);
    if dim>1
        imgsrc = rgb2gray(imgsrc);
    end
    if (x~=256 && y~=256)   %   8bit 256*256  
        imgsrc = im2uint8(imgsrc);
        imgsrc=imresize(imgsrc,[256,256]);
    end 
    [showing_noise, img_noise]= add_noise(imgsrc,noise);
    img= my_gaussian(img_noise,n,k); 
    [m theta sector canny1  canny2 bin] = canny1step(img, thr);
    figure(1)    
            imshow(imgsrc);%  
    figure(2)  
            imshow(showing_noise);
    figure(3)  
            imshow(img);%     
    figure(4)  
            imshow(uint8(m));%  
    figure(5)  
            imshow(uint8(canny1));%      
    figure(6)  
            imshow(uint8(canny2));%   
    

    좋은 웹페이지 즐겨찾기