[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 영상