Как преобразовать изображение в один размерный массив, используя PIL? - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь преобразовать изображение руки в массив, если пиксели руки будут белыми, а все остальные пиксели черными.

Ниже приведен рабочий код в GNU Octave, который я пытаюсьрепликация в python (см. мой код ниже)

function image_out = processSkinImage(filename)
    Step 1...
    % Read the image
    original = imread(filename);
    ...
    Step 2...
    % Resize the image to 50x50
    image_resized = imresize(original, scale);
    [M N Z] = size(image_resized);

    % Initialize the output image
    image_out = zeros(height,width);
    image_out = zeros(M,N);
    ...
    Step 3...
    % Convert the image from RGB to YCbCr
    img_ycbcr = rgb2ycbcr(image_resized);
    Cb = img_ycbcr(:,:,2);
    Cr = img_ycbcr(:,:,3);
    ...
    Step 4...
    % Get the central color of the image
    % Expected the hand to be in the central of the image
    central_color = img_ycbcr(int32(M/2),int32(N/2),:);
    Cb_Color = central_color(:,:,2);
    Cr_Color = central_color(:,:,3);
    % Set the range
    Cb_Difference = 15;
    Cr_Difference = 10;
    ...
    Step 5...
    % Detect skin pixels
    [r,c,v] = find(Cb>=Cb_Color-Cr_Difference & Cb<=Cb_Color+Cb_Difference & Cr>=Cr_Color-Cr_Difference & Cr<=Cr_Color+Cr_Difference);
    ...
    Step 6...
    % Mark detected pixels
    for i=1:match_count
        image_out(r(i),c(i)) = 1;
    end
end

Вот что я написал в python:

from PIL import Image as im

image = im.open('/Users/eitan/Desktop/eell.jpg')
image = image.resize((50,50), im.NEAREST)

grayScale = image.convert(mode='L')
grayScale.show()
width, height = grayScale.size

mid_pixel=grayScale.getpixel((width/2,height/2))
print (mid_pixel)

pixels = grayScale.load()

for i in range(grayScale.size[0]):    # for every col:
    for j in range(grayScale.size[1]):    # For every row
        if grayScale.getpixel((i,j)) < mid_pixel+15 and grayScale.getpixel((i,j)) > mid_pixel-15:
            pixels[i,j] = 255
        else:
            pixels[i, j] = 0

grayScale.show()

Это приводит к тому, что часть руки и часть фона являютсябелый - в то время как остальная часть руки черная.

Где я понял что-то не так?

...