현실감각 0% :: [MATLAB] CT와 MCT 소스코드

컴퓨터 관련 2014.08.18 17:14

[MATLAB] CT와 MCT 소스코드



[MATLAB] CT(Census Transform)와 MCT(Modified Census Transform) MATLAB 소스코드


요즘 연구하는 인식 오브젝트가 별다른 특징이 없어서 왠만한 특징검출방법으로는 특징비스므리한것조차 찾아지지도 않는 문제에 봉착..ㅠ 그래서 이런저런 특징검출 방법을 사용하다가 MCT(Modified Census Transform) 소스를 구한김에 포스팅!

MCT는 주로 얼굴탐지/인식하는데 사용하는 특징이어서 여기저기 검색하면 얼굴 검출하는 방법과 함께 나오지만 여기 올린 소스는 어디까지나 그냥 MCT 특징맵만을 생성함을 미리 알려드림(-_-);


원본 소스는 여기 : https://siddhantahuja.wordpress.com/tag/matlab-code/


소스를 무상으로 공개해주신 위 블로그의 주인은 CT를 구현해놨다. CT 소스 뿐만 아니라 각종 스테레오비전 관련 소스도 있으니까 관심있으면 클릭클릭! 

CT나 MCT나 차이점은 중점으로 픽셀값을 각각 비교하느냐, 마스크의 평균값을 가지고 픽셀값을 각각 비교하느냐의 차이일뿐이므로 내가 필요한 MCT를 위해 소스를 살짝 수정해봤다.


% ************************************************************************* % Title: Function-Rank Transform of a given Image % Author: Siddhant Ahuja <=원작자 https://siddhantahuja.wordpress.com/ % Created: May 2008 % Copyright Siddhant Ahuja, 2008 % Inputs: Image (var: inputImage), Window size assuming square window (var: % windowSize) % Outputs: Rank Tranformed Image (var: rankTransformedImage), % Time taken (var: timeTaken) % Example Usage of Function: [a,b]=funcRankOneImage('Img.png', 3) % ************************************************************************* function [censusTransformedImage, timeTaken] = mct(inputImage, windowSize) % Grab the image information (metadata) using the function imfinfo try imageInfo=imfinfo(inputImage); % Since Census Transform is applied on a grayscale image, determine if the % input image is already in grayscale or color if(getfield(imageInfo,'ColorType')=='truecolor') % Read an image using imread function, convert from RGB color space to % grayscale using rgb2gray function and assign it to variable inputImage inputImage=rgb2gray(imread(inputImage)); else if(getfield(imageInfo,'ColorType')=='grayscale') % If the image is already in grayscale, then just read it. inputImage=imread(inputImage); else error('The Color Type of Input Image is not acceptable. Acceptable color types are truecolor or grayscale.'); end end catch inputImage=inputImage; end % Find the size (columns and rows) of the image and assign the rows to % variable nr, and columns to variable nc [nr,nc] = size(inputImage); % Check the size of window to see if it is an odd number. if (mod(windowSize,2)==0) error('The window size must be an odd number.'); end if (windowSize==3) bits=uint8(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint8 censusTransformedImage=uint8(zeros(nr,nc)); elseif (windowSize==5) bits=uint32(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint32 censusTransformedImage=uint32(zeros(nr,nc)); else error('The size of the window is not acceptable. Just 3x3 and 5x5 windows are acceptable.'); end % Initialize the timer to calculate the time consumed. tic; % Find out how many rows and columns are to the left/right/up/down of the % central pixel dImg = double(inputImage); C= (windowSize-1)/2; for(j=C+1:1:nc-C) % Go through all the columns in an image (minus C at the borders) for(i=C+1:1:nr-C) % Go through all the rows in an image (minus C at the borders) census = 0; % Initialize default census to 0 for (a=-C:1:C) % Within the square window, go through all the rows for (b=-C:1:C) % Within the square window, go through all the columns if (~(a==0 && b==0)) % Exclude the centre pixel from the calculation census=bitshift(census,1); %Shift the bits to the left by 1 % If the intensity of the neighboring pixel is less than % that of the central pixel, then add one to the bit % string % 이부분을 중심 픽셀이 아닌 평균과의 차로 변환하면 MCT %% CT 알고리즘(사용하려면 주석 제거하고, 아래 MCT소스는 주석치고 돌리면 됨) %if (inputImage(i+a,j+b) < inputImage(i,j)) % CT 알고리즘 % census=census+1; %end %% MCT 알고리즘 (귀찮아서 마스크사이즈 3만 구현. 다른 마스크 사이즈로 사용하려면 for문 넣어서 수정ㄱㄱ) sumv = dImg(i - 1,j - 1) + dImg(i - 1,j) + dImg(i - 1,j + 1) + dImg(i,j - 1) + dImg(i,j) + dImg(i,j + 1) + dImg(i + 1,j - 1) + dImg(i + 1,j) + dImg(i + 1,j + 1); avgv = sumv / 9.0; if (inputImage(i+a,j+b) < avgv) census=census+1; end end end end % Assign the census bit string value to the pixel in imgTemp censusTransformedImage(i,j) = census; end end % Stop the timer to calculate the time consumed. timeTaken=toc;


사용법은 저거 mct.m 파일로 저장한다음에 MATLAB에서 아래와 같이 엔터치면 끝 

inputImage = imread('kakaka.jpg'); 

windowSize = 3; %일단 3으로만 했는데 5로 하려면 MCT는 좀 바꿔야함(진작 for문으로 만들었어야 했는데...귀찮아서..) 

[censusTransformedImage, timeTaken] = mct(inputImage, windowSize);

figure, imshow(censusTransformedImage);


아래는 결과영상

원본영상


CT 영상

MCT 영상









  • 공돌이 2015.05.17 20:42

    안녕하세요. 영상처리 공부중인 학생입니다.
    위 코드를 똑같이 복사붙여넣기하였는데
    저는 왜 결과값이 사진 한장이 안나오고 세장이 겹처서나오는걸까요..

    • 현실감각0% 2015.05.18 10:18 신고

      RGB(또는 다른 컬러스페이스 사용 시)영상 입력 시 R, G, B 각각에 대해 처리하고 보여주도록 만들었습니다. 만약 한장만 원하신다면 영상을 그레이스케일로 변환하시고 사용하세요.
      그레이스케일 변환을 혹시라도 모르신다면
      gray = rgb2gray(rgb);
      이같이 rgb2gray 함수를 사용하시면 변환 가능합니다!

    • 공돌이 2015.05.18 19:06

      감사합니다.
      혹시 영상처리 서적은 뭘로보시는지요?
      인터넷자료로만 공부하기에는한계가느껴지네요~

    • 현실감각0% 2015.05.20 10:46 신고

      요즘은 인터넷만한게 없죠 ㅎㅎ 찾기만 잘찾는다면요
      책을 꼭 추천드린다면 영상처리의 바이블격인 'Digital Image Processing-Gonzalez Wood 저'가 좋습니다.
      번역본도 물론 있고요. 순서대로 쭉 읽기보단 사전처럼 그때그때 필요한 내용 찾아보기 좋아요.

  • 공돌이 2015.05.23 17:30

    제가 지금 3d reconstruction에 대한 프로젝트를 맡게 되어서 영상처리를 공부하고 있었습니다. 조금 더 찾아보니, 여기서 끝이 아니고 disparity맵을 구해서 stereo matching에 사용한다고 하는데 혹시 3d reconstruction도 하시나요?

    • chabert1@nate.com 2015.05.28 15:58

      답변이 늦었네요.
      안타깝게도 리컨스트럭션쪽은 제 분야가 아닙니다. ㅠㅠ
      스테레오 매칭을 하기 위해서는 영상에서 유사한 부분을 두점 이상
      찾아야하는데, 그때 다른곳과는 차별화된 특징이 필요하게됩니다.
      그때 사용할 특징을 찾기위해 MCT를 사용하는것 같네요.