python使用opencv切割图片白边
本文实例为大家分享了python使用opencv切割图片白边的具体代码,可以横切和竖切,供大家参考,具体内容如下
废话不多说直接上码,分享使人进步:
from PIL import Imagefrom itertools import groupbyimport cv2import datetimeimport os # from core.rabbitmq import MessageQueue THRESHOLD_VALUE = https://www.it610.com/article/230# 二值化时的阈值PRETREATMENT_FILE ='hq'# 横切时临时保存的文件夹W = 540# 最小宽度H = 960# 最小高度 class Pretreatment(object):__doc__ = "图片横向切割" def __init__(self, path, save_path, min_size=960):self.x = 0self.y = 0self.img_section = []self.continuity_position = []self.path = pathself.save_path = save_pathself.img_obj = Noneself.min_size = min_sizeself.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 = widthself.y = heightfor 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:returnif s[1] - s[0] < H:returncropped = 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):# v2try: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 = widthself.y = heightfor 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:returnif s[1] - s[0] < W:returncropped = 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))
原始图片:
文章图片
结果:
文章图片
文章图片
【python使用opencv切割图片白边】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- python自定义封装带颜色的logging模块