Как проанализировать только часть изображения? - PullRequest
2 голосов
/ 29 мая 2019

Я хочу проанализировать определенную часть изображения, в качестве примера я бы хотел сфокусироваться на нижнем правом сечении 200x200 и сосчитать все черные пиксели, пока у меня есть:

im1 = Image.open(path)
rgb_im1 = im1.convert('RGB')
for pixel in rgb_im1.getdata():

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Хотя вы могли бы сделать это с кадрированием и парой for петель, это действительно медленно и не идеально.

Я бы посоветовал вам использовать Numpy, поскольку он очень доступен, очень мощный и оченьfast.

Вот черный прямоугольник 400x300 с 1-пиксельной красной рамкой:

enter image description here

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Open the image and make into Numpy array
im = Image.open('image.png')
ni = np.array(im)

# Declare an ROI - Region of Interest as the bottom-right 200x200 pixels
# This is called "Numpy slicing" and is near-instantaneous https://www.tutorialspoint.com/numpy/numpy_indexing_and_slicing.htm
ROI = ni[-200:,-200:]

# Calculate total area of ROI and subtract non-zero pixels to get number of zero pixels
# Numpy.count_nonzero() is highly optimised and extremely fast
black = 200*200 - np.count_nonzero(ROI)
print(f'Black pixel total: {black}')

Пример вывода

Black pixel total: 39601

Да, вы можете сделать его короче, например:

h, w = 200,200 
im = np.array(Image.open('image.png'))
black = h*w - np.count_nonzero(ni[-h:,-w:])

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

# Display image to check
Image.fromarray(ROI).show()

enter image description here

1 голос
/ 29 мая 2019

Вы можете попробовать обрезать изображение до нужной части: -

img = Image.open(r"Image_location")
x,y = img.size
img = img.crop((x-200, y-200, x, y))

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

Исходное изображение: -

enter image description here

Изображение после обрезки: -

enter image description here

Затем можно использовать это обрезанное изображение, чтобы подсчитать количество черныхпикселей, где это зависит от вашего варианта использования, который вы считаете ЧЕРНЫМ пикселем (дискретное значение, например (0, 0, 0) или диапазон / порог (0-15, 0-15, 0-15)).

PS: - Конечное изображение всегда будет иметь размер 200x200 пикселей.

0 голосов
/ 29 мая 2019
from PIL import Image
img = Image.open("ImageName.jpg")
crop_area = (a,b,c,d)
cropped_img = img.crop(crop_area)
...