【问题标题】:How do you crop a PNG image in python?如何在 python 中裁剪 PNG 图像?
【发布时间】:2021-07-26 03:20:45
【问题描述】:

我已经成功地从面部图像中提取了皮肤贴片。然而;对于我的任务,我不需要底部的眼睛和睫毛部分。有没有办法从顶部以一个小角度裁剪以下 png 图像?生成的图像应为 PNG 格式。我想将以下原始图像裁剪为所需的图像:

Original Image

Desired Image

【问题讨论】:

  • 您是否考虑过使用 ImageMagick 又名 PythonMagick?听起来它可能对你有用:wiki.python.org/moin/ImageMagick
  • 有几种方法可以做到这一点。假设您知道角度,您可以旋转图像,使红线与 x 轴平行,然后在上方裁剪。然后将其旋转回来。这可能会在红线的左下方引入一些黑色像素。因为图像最终必须是方形的。这是您要避免的事情吗?
  • 方法二:如果您知道红线上的像素,或者您可以通过某种方式获取它们,对于每个像素,将其左侧的像素设置为透明( (0,0,0,0)对于 RGBA 表示)。然后从右下角的y轴值裁剪上图。
  • 我无法应用方法一,因为是的,需要所有不规则形状的皮肤区域,而不是正方形。不幸的是,对于第二种方法,我不知道像素值。有没有办法计算它们?
  • 我猜你必须在不需要的部分上画一个白色三角形。由于您似乎没有任何坐标,因此您必须使用 GIMP 或 Photoshop。

标签: python image opencv image-processing crop


【解决方案1】:

只要你有要裁剪的线条的颜色值,你就可以这样做:

import cv2
import numpy as np

img = cv2.imread("image.png")

for i, j in zip(*np.where(np.all(img == [0, 0, 253], 2))):
    img[:i, j] = 0

cv2.imshow("Image", img)
cv2.waitKey(0)

输出:

解释:

  1. 导入必要的库:
import cv2
import numpy as np
  1. 读入图片:
img = cv2.imread("image.png")
  1. 循环通过图像的索引,其中索引处像素的 BGR 值是线条颜色的 BGR 值:
for i, j in zip(*np.where(np.all(img == [0, 0, 253], 2))):
  1. 将内部索引处外部索引之前的所有像素设置为黑色。如果您将其可视化,它将是一条一条地绘制黑色垂直线:
    img[:i, j] = 0
  1. 显示生成的图像:
cv2.imshow("Image", img)
cv2.waitKey(0)

【讨论】:

  • 谢谢你的努力,但是红线是显示我要裁剪的区域,我画它是为了这个问题告诉人们我想裁剪什么,我不会有这个在我的图片中划线,因为皮肤贴片将被自动提取,我不希望贴片中的睫毛部分。抱歉,如果我不清楚,有没有其他方法可以从顶部裁剪图像并以相同的 PNG 格式获得结果?
  • @user10114711 你能贴出你想要裁剪的原始图片吗?
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 2020-10-18
  • 2013-12-20
  • 2015-05-10
  • 2019-12-09
  • 2013-03-13
相关资源
最近更新 更多