python使用opencv切割图片白边
作者:喝完这杯还有一箱 发布时间:2021-10-16 04:44:06
标签:python,切割图片
本文实例为大家分享了python使用opencv切割图片白边的具体代码,可以横切和竖切,供大家参考,具体内容如下
废话不多说直接上码,分享使人进步:
from PIL import Image
from itertools import groupby
import cv2
import datetime
import os
# from core.rabbitmq import MessageQueue
THRESHOLD_VALUE = 230 # 二值化时的阈值
PRETREATMENT_FILE = 'hq' # 横切时临时保存的文件夹
W = 540 # 最小宽度
H = 960 # 最小高度
class Pretreatment(object):
__doc__ = "图片横向切割"
def __init__(self, path, save_path, min_size=960):
self.x = 0
self.y = 0
self.img_section = []
self.continuity_position = []
self.path = path
self.save_path = save_path
self.img_obj = None
self.min_size = min_size
self.mkdir(self.save_path)
self.file_name = self.path.split('/')[-1]
def get_continuity_position_new(self):
img = cv2.imread(self.path)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(gray_image, THRESHOLD_VALUE, 255, cv2.THRESH_BINARY)
width = img.shape[1]
height = img.shape[0]
self.x = width
self.y = height
for i in range(0, height):
if thresh1[i].sum() != 255 * width:
self.continuity_position.append(i)
def filter_rule(self):
if self.y < self.min_size:
return True
def mkdir(self, path):
if not os.path.exists(path):
os.makedirs(path)
def get_section(self):
# 获取区间
for k, g in groupby(enumerate(self.continuity_position), lambda x: x[1] - x[0]):
l1 = [j for i, j in g] # 连续数字的列表
if len(l1) > 1:
self.img_section.append([min(l1), max(l1)])
def split_img(self):
print(self.img_section)
for k, s in enumerate(self.img_section):
if s:
if not self.img_obj:
self.img_obj = Image.open(self.path)
if self.x < W:
return
if s[1] - s[0] < H:
return
cropped = self.img_obj.crop((0, s[0], self.x, s[1])) # (left, upper, right, lower)
self.mkdir(os.path.join(self.save_path, PRETREATMENT_FILE))
cropped.save(os.path.join(self.save_path, PRETREATMENT_FILE, f"hq_{k}_{self.file_name}"))
def remove_raw_data(self):
os.remove(self.path)
def main(self):
# v2
try:
self.get_continuity_position_new()
self.filter_rule()
self.get_section()
self.split_img()
except Exception as e:
print(self.file_name)
print(e)
finally:
if self.img_obj:
self.img_obj.close()
class Longitudinal(Pretreatment):
def get_continuity_position_new(self):
print(self.path)
img = cv2.imread(self.path)
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(gray_image, THRESHOLD_VALUE, 255, cv2.THRESH_BINARY)
width = img.shape[1]
height = img.shape[0]
print(width, height)
self.x = width
self.y = height
for i in range(0, width):
if thresh1[:, i].sum() != 255 * height:
self.continuity_position.append(i)
def split_img(self):
print(self.img_section)
for k, s in enumerate(self.img_section):
if s:
if not self.img_obj:
self.img_obj = Image.open(self.path)
if self.y < H:
return
if s[1] - s[0] < W:
return
cropped = self.img_obj.crop((s[0], 0, s[1], self.y)) # (left, upper, right, lower)
cropped.save(os.path.join(self.save_path, f"{k}_{self.file_name}"))
def main(path, save_path):
starttime = datetime.datetime.now()
a = Pretreatment(path=path, save_path=save_path)
a.main()
for root, dirs, files in os.walk(os.path.join(save_path, PRETREATMENT_FILE)):
for i in files:
b = Longitudinal(path=os.path.join(save_path, PRETREATMENT_FILE, i), save_path=save_path)
b.main()
os.remove(os.path.join(save_path, PRETREATMENT_FILE, i))
endtime = datetime.datetime.now()
print(f'耗时:{(endtime - starttime)}')
if __name__ == '__main__':
path = '你图片存放的路径'
save_path = '要保存的路径'
for _, _, files in os.walk(path):
for i in files:
main(path=os.path.join(path, i), save_path=save_path)
os.rmdir(os.path.join(save_path, PRETREATMENT_FILE))
原始图片:
结果:
来源:https://blog.csdn.net/qq_37049050/article/details/108116304


猜你喜欢
- Python + OpenCV 直接上代码import cv2 import numpy as np from matplotlib imp
- 我们都知道,Numpy 是 Python 环境下的扩展程序库,支持大量的维度数组和矩阵运算;Pandas 也是 Python 环境下的数据操
- 文章举例说明一下在 vue 中如何更好的监听浏览器事件。原文介绍了一种新增 vue 实例的方法,单独监听事件。这样代码书写较为简练,容易管理
- 一.图像阈值化图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分
- 前不久网上公开了一个MySQL Func的漏洞,讲的是使用MySQL创建一个自定义的函数,然后通过这个函数来攻击服务器。最早看到相关的报道是
- 本文实例讲述了Python实现两个list求交集,并集,差集的方法。分享给大家供大家参考,具体如下:在python中,数组可以用list来表
- PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySide免费的开发商业软件。 PySide有15个模块。这些模块
- 前言在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的 Vuex 状态管理方案可以很好的解决组件之间的通信问
- 在 CodeBit.cn 的论坛中,有人问 Javascript 中如何截取小数位并实现四舍五入,这是一个很常用的 js 技术,帖子中也有网
- 针对弹幕的爬取我们如果只需要获取看到的网页里面的而数据,使用selenium就能实现,对于直播平台来说,往往有第三方平台api让你获取数据(
- 前言python 中 if 的用法(if else, if not, elif)if语句实际上是:if True: …
- 本文实例讲述了Python基础之条件控制操作。分享给大家供大家参考,具体如下:if 语句Python中if语句的一般形式如下所示:if co
- MySQL、Sphinx及许多数据库和搜索引擎中的查询是单线程的。比如说,在一台32个CPU核心、16个磁盘的R910服务器上执
- HTTP Referer是header的一部分, 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链
- 阅读上一篇:css基础教程属性篇 本篇主要介绍css对边框(border)的属性控制和链接(link)的伪类选择器.边框(border):
- 概述在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接。通常,与数据库服务进行通信的网络协议无需由应用程序本身实现,原因
- About最近在学习vue的过程中,仿照去哪儿网的移动端写了个小项目,旨在实践和巩固基础知识,但是今天发现去哪儿的首页上有一个组件用户体验较
- urllib 是 python 的内置模块, 主要用于处理url相关的一些操作,例如访问url、解析url等操作。urllib 包下面的 r
- aspjpeg组件官方下载地址:http://www.persits.com/说明: 1、aspjpeg能对图片水印进行透明度调整
- Python项目文件中安装 setup.py安装 setup.py 的过程与安装其他的 Python 包的过程类似。首先,你需要下载或者使用