2015-10-17 2 views
-4
%%skin detection 
[hue,s,v]=rgb2hsv(I); 
cb = 0.148* I(:,:,1) - 0.291* I(:,:,2) + 0.439 * I(:,:,3) + 128; 
cr = 0.439 * I(:,:,1) - 0.368 * I(:,:,2) -0.071 * I(:,:,3) + 128; 
[w h]=size(I(:,:,1)); 
for i=1:w 
    for j=1:h  
     if 128<=cr(i,j) && cr(i,j)<=165 && 140<=cb(i,j) && cb(i,j)<=195 && 0.01<=hue(i,j) && hue(i,j)<=0.1 
      segment(i,j)=1; 
     else  
      segment(i,j)=0; 
     end  
    end 
end 
im(:,:,1)=I(:,:,1).*segment; 
im(:,:,2)=I(:,:,2).*segment; 
im(:,:,3)=I(:,:,3).*segment; 
%imshow(uint8(im)); 
title('My Edge Detection') 
im1 = imclearborder(im2bw(im)); 
    figure 
imshow(im1) 
im_fill = imfill(im1, 'holes'); 
figure 
imshow(im_fill) 
s = regionprops(im_fill, 'Area', 'PixelList'); 
[~,ind] = max([s.Area]); 
pix = sub2ind(size(im), s(ind).PixelList(:,2), s(ind).PixelList(:,1)); 
out = zeros(size(im)); 
out(pix) = im(pix); 
imshow(out); 

Здесь после вычитания лица, и выяснить, самый большой соединять области. Я хочу обрезать эту область с исходного изображения.Обнаружение стороны Использование Matlab

+2

Разместите свой вопрос с дополнительной информацией и/или добавьте комментарии в свой код, чтобы мы могли вам помочь. –

+0

@BrianLynch в первой части после вычитания лица через альт-джонс, затем я перешел в Hue для определения цвета кожи, после чего обнаружил самую большую связанную область в двоичном изображении (руке). Теперь, как я могу обрезать эту область области подключения с исходного входного изображения. –

+0

Вы спрашиваете, как взять исходное изображение и превратить все пиксели, которые _not_ в связанную область черные или что-то еще? –

ответ

0

Попробуйте использовать этот подход, чтобы вырезать часть изображения, созданную с пороговой маской.

В основном код находит часть изображения, которое должно быть извлечено на основе некоторого логического значения. Я использую subPass, который имеет высоту и ширину изображения и содержит 1 для пикселов, которые необходимо извлечь, и 0 для пикселей это следует игнорировать.

Как только у вас есть эта булева матрица, вы можете использовать ее для установки пикселей, которые вы хотите игнорировать, как черные (если это то, что вы хотите сделать). Или вы можете найти минимальный и максимальный индексы, которые образуют границу вокруг целевой части, которую нужно извлечь, а затем обрезать изображение на основе этих индексов (I и J в моем коде).

% load image 
img = double(imread('sample.jpg'))/255; 

% find some particular region... say all pixels that are nearly white 
% this will be a matrix with 1's where the pixel passes the test 
subPass = double((img(:,:,1) >= 0.95).*(img(:,:,2) >= 0.95).*(img(:,:,3) > 0.95)); 

% set all the pixels not in the target region to be black 
imgNew = img; 
imgNew(:,:,1) = img(:,:,1).*subPass; 
imgNew(:,:,2) = img(:,:,2).*subPass; 
imgNew(:,:,3) = img(:,:,3).*subPass; 

% plot results 
figure 
image([img imgNew]); 
axis equal; 
axis tight 

% find indices of target region 
[I,J] = find(subPass == 1); 

% crop target region based on min/max indices 
imgNewCrop = imgNew(min(I):max(I),min(J):max(J),:); 

% plot cropped image 
figure 
image(imgNewCrop); 
axis equal 
axis tight 

Вы можете использовать это изображение от here (просто скачать и переименовать в "sample.jpg").