如何仅分析图像的一部分?

时间:2019-05-29 00:39:57

标签: python python-imaging-library

我想分析图像的特定部分,例如,我想着眼于右下200x200区域并计算所有黑色像素,到目前为止,我已经:

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

3 个答案:

答案 0 :(得分:1)

您可以尝试将图像裁剪到所需的特定部分:-

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

然后,您可以使用此裁剪后的图像计算黑色像素的数量,具体取决于您的用例,您将其视为 BLACK 像素(离散值,例如(0,0, 0)或范围/阈值(0-15、0-15、0-15)。

P.S。:-:最终图像的尺寸始终为200x200像素。

答案 1 :(得分:1)

尽管您可以通过裁剪和一对for循环来做到这一点,但这确实很慢且不理想。

我建议您使用Numpy,因为它非常普遍,功能强大且速度很快。

这是一个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图像,然后可以显示该图像。因此,在获得投资回报率后,只需在任何地方使用此行即可:

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

enter image description here

答案 2 :(得分:0)

from PIL import Image
img = Image.open("ImageName.jpg")
crop_area = (a,b,c,d)
cropped_img = img.crop(crop_area)