用python切掉图片的黑边

手机里有很多G+里的截屏,都有一些黑边。像这样:

因为原图片的长宽不一定,导致黑边的大小不一定。

虽然图片都是居中的,但是有些图片是宽比高大,是横着截图的,所以这样的情况是上下左右都可能有黑边。

于是想到了用python的 PIL库来进行裁切。

研究了一下,原代码如下

from PIL import Image
import os 

src_folder = "."
tar_folder = "tar"
backup_folder = "backup"

def isCrust(pix):
    return sum(pix) < 25

def hCheck(img, y, step = 50):
    count = 0
    width = img.size[0]
    for x in xrange(0, width, step):
        if isCrust(img.getpixel((x, y))):
            count += 1
        if count > width / step / 2:
            return True
    return False

def vCheck(img, x, step = 50):
    count = 0
    height = img.size[1]
    for y in xrange(0, height, step):
        if isCrust(img.getpixel((x, y))):
            count += 1
        if count > height / step / 2:
            return True
    return False

def boundaryFinder(img,crust_side,core_side,checker):
    if not checker(img,crust_side):
        return crust_side
    if checker(img,core_side):
        return core_side

    mid = (crust_side + core_side) / 2
    while  mid != core_side and mid != crust_side:
        if checker(img,mid):
            crust_side = mid
        else:
            core_side = mid
        mid = (crust_side + core_side) / 2
    return core_side
    pass

def handleImage(filename,tar):
    img = Image.open(os.path.join(src_folder,filename))
    if img.mode != "RGB":
        img = img.convert("RGB")
    width, height = img.size

    left = boundaryFinder(img, 0, width/2, vCheck)
    right = boundaryFinder(img, width-1, width/2, vCheck)
    top = boundaryFinder(img, 0, height/2, hCheck)
    bottom = boundaryFinder(img, height-1, width/2, hCheck)

    rect = (left,top,right,bottom)
    print rect
    region = img.crop(rect)
    region.save(os.path.join(tar,filename),'PNG')
    pass

def folderCheck(foldername):
    if foldername:
        if not os.path.exists(foldername):
            os.mkdir(foldername)
            print "Info: Folder \"%s\" created" % foldername
        elif not os.path.isdir(foldername):
            print "Error: Folder \"%s\" conflict" % foldername
            return False
    return True
    pass

def main():
    if folderCheck(tar_folder) and folderCheck(src_folder) and folderCheck(backup_folder):
        for filename in os.listdir(src_folder):
            if filename.split('.')[-1].upper() in ("JPG","JPEG","PNG","BMP","GIF"):
                handleImage(filename,tar_folder)
                os.rename(os.path.join(src_folder,filename),os.path.join(backup_folder,filename))
        pass

if __name__ == '__main__':
    main()
    #handleImage('Screenshot_2013-10-13-21-55-14.png','')

代码作用是 遍历当前文件夹下的所有JPG PNG BMP GIF文件,找到内容上下左右的边距(实际上是内容矩形左上右下两点的坐标),将切出来的图片保存到目标文件夹中,并备份源文件到备份文件夹中。

boundaryFinder() 函数使用时间复杂度为O(log n)的算法来找到内容的边缘所在的线(可能是横线也可能是竖线,取决于checker使用的是哪一个函数)

hCheck() 和 vCheck() 函数分别水平和竖直地对图片上的某条线,相等间隔(默认50)的取点。如果这些点有一半被认为属于要被切掉的边,就会返回true

isCrust()函数判断点是否属于要切掉的边 本例中 RGB三色加起来小于25 就被认为是要黑边的内容

效果如下:

这个代码适用于有纯色边的图片剪切。通过修改isCrust() 函数的算法 可以适用于不同纯色边的裁切

用python切掉图片的黑边

时间: 2024-08-20 10:59:54

用python切掉图片的黑边的相关文章

用Python脱掉图片人物的裤子!真的是羞羞脸哦!

小编整理一套Python资料和PDF,有需要Python学习资料可以加学习群:984632579,反正闲着也是闲着呢,不如学点东西啦~~ 效果演示 本文案例使用的是开源项目instagan,是一种比较新的gan模型建模原理,来自2019年ICLR的论文,下面看下效果对照: (出于人道主义,会把人物的长裤脱掉然后换上短裙) 环境配置 首先玩这个模型需要以下前提条件: 有梯子 python3.6 版本 有GPU环境(因为源代码是要求必须在GPU的Cuda环境下运行,如果没有GPU的同学推荐用PAI里

Unity3D NGUI图集切成图片

Unity3D NGUI图集切成图片 有的时候用NGUI做好了图集,那么原图就没有必要放到Unity3D中了,严重影响Unity3D的速度.但是突然右想把图片弄出来.当然NGUI是提供了图集中单个图片另存,但是如果图片太多,比较费时间,所以用python写了个切图片的工具代码如下: Python环境:2.7 测试通过,需要依赖Image库 NGUI版本:3.7 #coding:utf-8 #unity 图集裁剪成png #Author:Wiker Yong #Date:2015-07-08 im

Python批量修改图片格式和尺寸

Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入send2trash库,是把删除的文件放进垃圾箱,而不是永久删除,这个我只是防止删除有用的文件而搞得,有点严谨了是吧,不需要的可以删掉啊. 4.我这个脚本是Python2.7编写的,但是在处理中文编码的时候非常恶心,尽管最后被我解决了,这个解决的方法,我随后会再单独写一篇,但是此刻我是建议大家不要用

用Python玩转图片处理,并导出文件列表到Excel文件

1.用Python玩转图片处理 class ImageUtils: """ 图片处理工具 """ def __init__(self, source_dir, target_dir): self.source_dir = source_dir self.target_dir = target_dir def thumbnail(self, filename, percent=0.5): '缩略图' im = Image.open(os.path.

python生成测试图片

直接代码 1 import cv2.cv as cv 2 saveImagePath = 'E:/ScreenTestImages/' 3 4 colorRed = [0,0,255] 5 colorGreen = [0,255,0] 6 colorBlue = [255,0,0] 7 colorWhite = [255,255,255] 8 colorBlack = [0,0,0] 9 colorAqua = [255,255,0] 10 colorFuchsia = [255,0,255]

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

python加载图片

在Python中对图片的处理采用了PIL库,这个库可用于图片的一些常用操作,如改变尺寸.格式.色彩.旋转等处理. 首先要先安装Python(在这里不做介绍). 安装完Python后,安装PIL库就非常简单了,只需按如下步骤进行 1.下载PIL的Source Kit(因为这个包支持全部平台) Imaging--1.1.6.tar.gz   URL:  http://www.pythonware.com/products/pil/index.htm 2.解压缩包 tar -zxvf Imaging-

碉堡了,python识别黄色图片

创建testimg.py import sysfrom PIL import Image img = Image.open(sys.argv[1]).convert('YCbCr') w, h = img.size data = img.getdata() cnt = 0 for i, ycbcr in enumerate(data): y, cb, cr = ycbcr if 86 <= cb <= 117 and 140 <= cr <= 168: cnt += 1 print

教人切掉乳房做女强人,是变态还是变态

鼓动要做女强人就切子宫 据介绍,东莞蒙正国学馆开办的“女德班”,要求学员开课前要向馆长叩拜.其倡导的“女德”四项基本原则是“打不还手,骂不还口,逆来顺受,绝不离婚”,还鼓动女学员称“如果要做女强人,就得切掉子宫.切除乳房,放弃所有女性特点”. 据了解,该“女德班”每年举办12期,每期约50人,全天学习,一期一周时间,最新一期的“女德班”是9月2日才开课的. 责令停办学员将尽快遣散 经查,该蒙正国学馆的主办机构位于东莞市青山工业园内,工商登记经营范围为展览.庆典活动.文化演出等,但目前主要的业务为