谁能帮我弄清楚发生了什么事在我的图像自动裁剪脚本? 我有一个大的透明区域/空间PNG图像。 我想能够自动裁剪那个空间出来,剩下的要领。 原始图像具有正方形画布,最好这将是长方形的,只是封装分子。

这里的原始图像:

做了一些谷歌上搜索我碰到这是上报工作PIL / Python代码,但是在我手中,运行下面的代码在作物的图像。

import Image

import sys

image=Image.open('L_2d.png')

image.load()

imageSize = image.size

imageBox = image.getbbox()

imageComponents = image.split()

rgbImage = Image.new("RGB", imageSize, (0,0,0))

rgbImage.paste(image, mask=imageComponents[3])

croppedBox = rgbImage.getbbox()

print imageBox

print croppedBox

if imageBox != croppedBox:

cropped=image.crop(croppedBox)

print 'L_2d.png:', "Size:", imageSize, "New Size:",croppedBox

cropped.save('L_2d_cropped.png')

输出是这样的:

任何人都更熟悉图像处理/ PLI可以帮我找出这个问题?

Answer 1:

您可以使用numpy的,将图像转换为阵,找到所有非空列和行,然后创建这些图像:

import Image

import numpy as np

image=Image.open('L_2d.png')

image.load()

image_data = np.asarray(image)

image_data_bw = image_data.max(axis=2)

non_empty_columns = np.where(image_data_bw.max(axis=0)>0)[0]

non_empty_rows = np.where(image_data_bw.max(axis=1)>0)[0]

cropBox = (min(non_empty_rows), max(non_empty_rows), min(non_empty_columns), max(non_empty_columns))

image_data_new = image_data[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]

new_image = Image.fromarray(image_data_new)

new_image.save('L_2d_cropped.png')

结果看起来像

如果有不清楚的地方,只问。

Answer 2:

对我来说,它的工作原理为:

import Image

image=Image.open('L_2d.png')

imageBox = image.getbbox()

cropped=image.crop(imageBox)

cropped.save('L_2d_cropped.png')

当通过搜索边界mask=imageComponents[3]则仅通过蓝色通道搜索。

Answer 3:

我测试了大部分的答案回复在这个岗位,但是,我结束了我自己的答案。 我用蟒蛇python3。

from PIL import Image, ImageChops

def trim(im):

bg = Image.new(im.mode, im.size, im.getpixel((0,0)))

diff = ImageChops.difference(im, bg)

diff = ImageChops.add(diff, diff, 2.0, -100)

bbox = diff.getbbox()

if bbox:

return im.crop(bbox)

if __name__ == "__main__":

bg = Image.open("test.jpg") # The image to be cropped

new_im = trim(bg)

new_im.show()

Answer 4:

下面是使用另一个版本pyvips 。

这一个是有点爱好者:它看起来在像素(0,0),假定为背景色,然后再执行中值滤波和找到的第一个和最后一行以及含有从由多个不同的像素列大于阈值。 这种额外的处理装置,它也适用于照相或压缩图像,其中,一个简单的修整可以通过噪声或压缩失真被甩出。

import sys

import pyvips

# An equivalent of ImageMagick's -trim in libvips ... automatically remove

# "boring" image edges.

# We use .project to sum the rows and columns of a 0/255 mask image, the first

# non-zero row or column is the object edge. We make the mask image with an

# amount-differnt-from-background image plus a threshold.

im = pyvips.Image.new_from_file(sys.argv[1])

# find the value of the pixel at (0, 0) ... we will search for all pixels

# significantly different from this

background = im(0, 0)

# we need to smooth the image, subtract the background from every pixel, take

# the absolute value of the difference, then threshold

mask = (im.median(3) - background).abs() > 10

# sum mask rows and columns, then search for the first non-zero sum in each

# direction

columns, rows = mask.project()

# .profile() returns a pair (v-profile, h-profile)

left = columns.profile()[1].min()

right = columns.width - columns.fliphor().profile()[1].min()

top = rows.profile()[0].min()

bottom = rows.height - rows.flipver().profile()[0].min()

# and now crop the original image

im = im.crop(left, top, right - left, bottom - top)

im.write_to_file(sys.argv[2])

这是一种在运行8K x 8K的像素NASA地球图像 :

$ time ./trim.py /data/john/pics/city_lights_asia_night_8k.jpg x.jpg

real 0m1.868s

user 0m13.204s

sys 0m0.280s

peak memory: 100mb

之前:

后:

有一个博客张贴在这里的一些更多的讨论 。

Answer 5:

跨此帖一最近,发现了PIL库发生了变化。 我重新实现这跟OpenCV的:

import cv2

def crop_im(im, padding=0.1):

"""

Takes cv2 image, im, and padding % as a float, padding,

and returns cropped image.

"""

bw = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

rows, cols = bw.shape

non_empty_columns = np.where(bw.min(axis=0)<255)[0]

non_empty_rows = np.where(bw.min(axis=1)<255)[0]

cropBox = (min(non_empty_rows) * (1 - padding),

min(max(non_empty_rows) * (1 + padding), rows),

min(non_empty_columns) * (1 - padding),

min(max(non_empty_columns) * (1 + padding), cols))

cropped = im[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]

return cropped

im = cv2.imread('testimage.png')

cropped = crop_im(im)

cv2.imshow('', cropped)

cv2.waitKey(0)

Answer 6:

我知道,这个职位是旧的,但由于某种原因,没有任何提示的答案为我工作。 所以我砍死从现有的答案我自己的版本:

import Image

import numpy as np

import glob

import shutil

import os

grey_tolerance = 0.7 # (0,1) = crop (more,less)

f = 'test_image.png'

file,ext = os.path.splitext(f)

def get_cropped_line(non_empty_elms,tolerance,S):

if (sum(non_empty_elms) == 0):

cropBox = ()

else:

non_empty_min = non_empty_elms.argmax()

non_empty_max = S - non_empty_elms[::-1].argmax()+1

cropBox = (non_empty_min,non_empty_max)

return cropBox

def get_cropped_area(image_bw,tol):

max_val = image_bw.max()

tolerance = max_val*tol

non_empty_elms = (image_bw<=tolerance).astype(int)

S = non_empty_elms.shape

# Traverse rows

cropBox = [get_cropped_line(non_empty_elms[k,:],tolerance,S[1]) for k in range(0,S[0])]

cropBox = filter(None, cropBox)

xmin = [k[0] for k in cropBox]

xmax = [k[1] for k in cropBox]

# Traverse cols

cropBox = [get_cropped_line(non_empty_elms[:,k],tolerance,S[0]) for k in range(0,S[1])]

cropBox = filter(None, cropBox)

ymin = [k[0] for k in cropBox]

ymax = [k[1] for k in cropBox]

xmin = min(xmin)

xmax = max(xmax)

ymin = min(ymin)

ymax = max(ymax)

ymax = ymax-1 # Not sure why this is necessary, but it seems to be.

cropBox = (ymin, ymax-ymin, xmin, xmax-xmin)

return cropBox

def auto_crop(f,ext):

image=Image.open(f)

image.load()

image_data = np.asarray(image)

image_data_bw = image_data[:,:,0]+image_data[:,:,1]+image_data[:,:,2]

cropBox = get_cropped_area(image_data_bw,grey_tolerance)

image_data_new = image_data[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]

new_image = Image.fromarray(image_data_new)

f_new = f.replace(ext,'')+'_cropped'+ext

new_image.save(f_new)

Answer 7:

这是对snew的答复,这适用于透明背景的改善。 随着mathematical morphology我们可以把它放在白色背景(而不是透明的)工作,用下面的代码:

from PIL import Image

from skimage.io import imread

from skimage.morphology import convex_hull_image

im = imread('L_2d.jpg')

plt.imshow(im)

plt.title('input image')

plt.show()

# create a binary image

im1 = 1 - rgb2gray(im)

threshold = 0.5

im1[im1 <= threshold] = 0

im1[im1 > threshold] = 1

chull = convex_hull_image(im1)

plt.imshow(chull)

plt.title('convex hull in the binary image')

plt.show()

imageBox = Image.fromarray((chull*255).astype(np.uint8)).getbbox()

cropped = Image.fromarray(im).crop(imageBox)

cropped.save('L_2d_cropped.jpg')

plt.imshow(cropped)

plt.show()

文章来源: Automatically cropping an image with python/PIL

python自动裁剪图片_自动裁剪与Python / PIL的图像(Automatically cropping an ima相关推荐

  1. python pdf删除图片_【原创】python批量删除pdf图片水印(Xobject)的一种方法

    1.说明: 下载到的pdf总会有一些水印,pdf文件水印添加方式除了acrobat adobe自带的以外,还有很多,所以去除水印方法也很多,这里介绍的也只是一种适用python批量删除图片水印Xobj ...

  2. python风格变换图片_【人工智能】python图片风格迁移,来欣赏梵高风格的石原里美吧!...

    图像的风格迁移,心心念念好久了啊! 简单几个步骤,就可以转换图片风格啦. 1. 在github下载模型,模型后缀名是 t7,新建 model 文件夹用来存放模型 2. 新建 fengge.py 文件, ...

  3. python外星人入侵游戏图片_外星人入侵,使用python开发的2D游戏

    开学自学的python,通过敲代码练习的项目<外星人入侵>. 游戏介绍:游戏在玩家每消灭一群向下移动的外星人后,都将玩家的等级提高一个等级:而等级越高,游戏的节奏越快,难度越大 我使用的是 ...

  4. python实时显示图片_任何显示来自Cam的实时图像的快速Python GUI

    我建议使用Tkinter,因为它已经是python的一部分了.我从来没有使用过PIL,但是一个快速的google显示在Tk小部件中使用PIL图像很容易(通过PIL.ImageTk.PhotoImage ...

  5. python cv2读取图片后进行通道变换以及PIL阅读图像的通道转换

    读取的 图片的格式是HxWx3,像素值在0-1之间 img = cv2.imread('b.png') print(img.shape) img = img.permute(2,0,1) #如果进行H ...

  6. python 读取excel图片_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  7. 计算摄影 | 计算机如何学会自动裁剪图片(自动构图)?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 自动构图基础 1.1 什么是构图 自动裁剪用摄影的话语来说,就 ...

  8. 【计算摄影】计算机如何学会自动裁剪图片(自动构图)?

    大家好,这是专栏<计算摄影>的第三篇文章,这一个专栏来自于计算机科学与摄影艺术的交叉学科.今天我们讨论的问题是图像的自动裁剪/自动构图问题. 作者&编辑 | 言有三 1 自动构图基 ...

  9. mac用python爬虫下载图片_使用Python爬虫实现自动下载图片

    python爬虫支持模块多.代码简洁.开发效率高 ,是我们进行网络爬虫可以选取的好工具.对于一个个的爬取下载,势必会消耗我们大量的时间,使用Python爬虫就可以解决这个问题,即可以实现自动下载.本文 ...

最新文章

  1. 赠书 | 干货!用 Python 动手学强化学习
  2. C语言--static修饰变量
  3. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算案例二 | 计算 卷积 )
  4. 英特尔高级副总裁:收购McAfee是为股东考虑
  5. mac电脑开机出现客人用户,没有输入密码框,其他键都点不动,重启也不好使
  6. mysql r和n的区别_mysql数据库 r n
  7. java字符串剪切函数,java用substring函数截取string中一段字符串,substringstring
  8. java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
  9. 一些用xib加载主界面的过程
  10. ca证书申请流程有哪些?
  11. winrar注册以及去广告
  12. 达人评测 Redmi G 2021锐龙版怎么样
  13. Kickstarter | 海外项目汇总
  14. Lect5_Model_free_Control
  15. Linux 下使用Trickle限制下载/上传带宽
  16. 运用多线程知识写一个火车站售票系统
  17. CSDN,我的良师益友
  18. 自制PLC—木牛流马PLC V1.1发布
  19. 成神之路 第015期。
  20. 基于大数据的预测工具:寿命计算器,准确率高达98%,算算你能活多久?

热门文章

  1. Dubbo+Flutter在线交友平台教程第一天 项目介绍和框架搭建
  2. 《高德地图app AR导航》安装及设置 【全景导航 】【视频导航】【AR导航】
  3. 项目管理手记(八) SaaS模式的DRP系统是否适用? 1
  4. MeterSphere 数据库使用
  5. 系统架构分析,C/S架构和B/S架构
  6. Golang 具名返回参数 具名返回值 定义方法
  7. 如何在WPS Office 个人版中使用VBA语言
  8. python整型数据源码分析_Python2 基本数据结构源码解析
  9. 前端 uniapp 实现base64格式图片保存到相册
  10. 2020焊工(初级)模拟考试题库及焊工(初级)模拟考试系统