我想分析图像的特定部分,例如,我想着眼于右下200x200区域并计算所有黑色像素,到目前为止,我已经:
im1 = Image.open(path)
rgb_im1 = im1.convert('RGB')
for pixel in rgb_im1.getdata():
答案 0 :(得分:1)
您可以尝试将图像裁剪到所需的特定部分:-
img = Image.open(r"Image_location")
x,y = img.size
img = img.crop((x-200, y-200, x, y))
以上代码获取输入图像,并将其裁剪到其右下角200x200像素。 (请确保图像尺寸大于200x200,否则将发生错误)
原始图片:-
裁剪后的图像:-
然后,您可以使用此裁剪后的图像计算黑色像素的数量,具体取决于您的用例,您将其视为 BLACK 像素(离散值,例如(0,0, 0)或范围/阈值(0-15、0-15、0-15)。
P.S。:-:最终图像的尺寸始终为200x200像素。
答案 1 :(得分:1)
尽管您可以通过裁剪和一对for
循环来做到这一点,但这确实很慢且不理想。
我建议您使用Numpy,因为它非常普遍,功能强大且速度很快。
这是一个400x300的黑色矩形,带有1像素的红色边框:
#!/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()
答案 2 :(得分:0)
from PIL import Image
img = Image.open("ImageName.jpg")
crop_area = (a,b,c,d)
cropped_img = img.crop(crop_area)