如何使用 Python PIL 或 CV 裁剪图像?

Posted

技术标签:

【中文标题】如何使用 Python PIL 或 CV 裁剪图像?【英文标题】:How to crop the Image using Python PIL or CV? 【发布时间】:2018-02-14 08:18:58 【问题描述】:

我的所有图像都具有以虚线为界的感兴趣区域。 我只想裁剪那些部分。

我有一个想法,找到左上角的最小值(x,y)并找到右下角的最大值(x,y)并裁剪该区域?

我们可以从 PIL 库中获取像素值

【问题讨论】:

也许您愿意向我们展示您的图片,这样我们就不必猜测您的意思了... 【参考方案1】:
from PIL import Image
from IPython.display import display, html
from IPython.display import Image as displayImage 
img=Image.open('image.png')
imag_rgb = img.convert('RGB')
width, height = imag_rgb.size
print (width, height)
for pixel_x in range(width):
 for pixel_y in range(height):
  r, g, b = rgb_img.getpixel((pixel_x, pixel_y))
  if(r == 255 and g == 255 and b == 255):
   min_pixel_x = pixel_x
   min_pixel_y = pixel_y
   max_pixel_x = pixel_x
   max_pixel_y = pixel_y                
   print (pixel_x, pixel_y)
    cropped_image = img.crop((min_pixel_x, min_pixel_y,max_pixel_x + 1, max_pixel_y + 1))
#### +1 because of first x,y is 0,0
display(cropped_image)

【讨论】:

【参考方案2】:

使用 opencv2 很容易裁剪图像。试试这个链接

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

ball = img[280:340, 330:390]

由于 Image 是一个二维数组,您可以使用上面的线进行裁剪。

【讨论】:

【参考方案3】:

读取 PIL 中的像素值

from PIL import Image
im = Image.open(imagename)
pix = im.load()
print (pix[0,0])

这将返回第一行中的第一个像素。

如果你想读取所有像素,你可以这样做。

x, y = im.size

for i in x:
    for j in y:
        print (pix[i,j])

【讨论】:

这不是一个好方法。避免 for 循环,它们很慢。切片应该是首选。查看其他答案。

以上是关于如何使用 Python PIL 或 CV 裁剪图像?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何使用Open-cv或PIL将24位PNG图像转换为32位

如何在 Python 中检测边缘并裁剪图像

使用 Python / PIL 进行多边形裁剪/剪辑

1.图像裁剪、加边框、旋转(Python PIL)

如何使用 Python 图像库裁剪通过鼠标单击选择的区域?

如何使用 PIL 在单个白色背景上检测和裁剪多个图像?