Python OpenCV图像指定区域裁剪的实现


Posted in Python onOctober 30, 2019

在工作中。在做数据集时,需要对图片进行处理,照相的图片我们只需要特定的部分,所以就想到裁剪一种所需的部分。当然若是图片有规律可循则使用opencv对其进行膨胀腐蚀等操作。这样更精准一些。

一、指定图像位置的裁剪处理

import os  
import cv2 
 
# 遍历指定目录,显示目录下的所有文件名
def CropImage4File(filepath,destpath):
  pathDir = os.listdir(filepath)  # 列出文件路径中的所有路径或文件
  for allDir in pathDir:
    child = os.path.join(filepath, allDir)
    dest = os.path.join(destpath,allDir)
    if os.path.isfile(child):
     image = cv2.imread(child) 
      sp = image.shape      #获取图像形状:返回【行数值,列数值】列表
      sz1 = sp[0]         #图像的高度(行 范围)
      sz2 = sp[1]         #图像的宽度(列 范围)
      #sz3 = sp[2]        #像素值由【RGB】三原色组成
      
      #你想对文件的操作
      a=int(sz1/2-64) # x start
      b=int(sz1/2+64) # x end
      c=int(sz2/2-64) # y start
      d=int(sz2/2+64) # y end
      cropImg = image[a:b,c:d]  #裁剪图像
      cv2.imwrite(dest,cropImg) #写入图像路径
      
if __name__ == '__main__':
  filepath ='F:\\\maomi'       #源图像
  destpath='F:\\maomi_resize'    # resized images saved here
  CropImage4File(filepath,destpath)

二、批量处理—指定图像位置的裁剪

我这个是用来截取发票的印章区域,用于图像分割(公司的数据集保密)

各位可以用自己的增值发票裁剪。适当的更改截取区域

"""
处理数据集 和 标签数据集的代码:(主要是对原始数据集裁剪)
  处理方式:分别处理
  注意修改 输入 输出目录 和 生成的文件名
  output_dir = "./label_temp"
  input_dir = "./label"
"""
import cv2
import os
import sys
import time


def get_img(input_dir):
  img_paths = []
  for (path,dirname,filenames) in os.walk(input_dir):
    for filename in filenames:
      img_paths.append(path+'/'+filename)
  print("img_paths:",img_paths)
  return img_paths


def cut_img(img_paths,output_dir):
  scale = len(img_paths)
  for i,img_path in enumerate(img_paths):
    a = "#"* int(i/1000)
    b = "."*(int(scale/1000)-int(i/1000))
    c = (i/scale)*100
    time.sleep(0.2)
    print('正在处理图像: %s' % img_path.split('/')[-1])
    img = cv2.imread(img_path)
    weight = img.shape[1]
    if weight>1600:             # 正常发票
      cropImg = img[50:200, 700:1500]  # 裁剪【y1,y2:x1,x2】
      #cropImg = cv2.resize(cropImg, None, fx=0.5, fy=0.5,
                 #interpolation=cv2.INTER_CUBIC) #缩小图像
      cv2.imwrite(output_dir + '/' + img_path.split('/')[-1], cropImg)
    else:                    # 卷帘发票
      cropImg_01 = img[30:150, 50:600]
      cv2.imwrite(output_dir + '/'+img_path.split('/')[-1], cropImg_01)
    print('{:^3.3f}%[{}>>{}]'.format(c,a,b))

if __name__ == '__main__':
  output_dir = "../img_cut"      # 保存截取的图像目录
  input_dir = "../img"        # 读取图片目录表
  img_paths = get_img(input_dir)
  print('图片获取完成 。。。!')
  cut_img(img_paths,output_dir)

三、多进程(加快处理)

#coding: utf-8
"""
采用多进程加快处理。添加了在读取图片时捕获异常,OpenCV对大分辨率或者tif格式图片支持不好
处理数据集 和 标签数据集的代码:(主要是对原始数据集裁剪)
  处理方式:分别处理
  注意修改 输入 输出目录 和 生成的文件名
  output_dir = "./label_temp"
  input_dir = "./label"
"""
import multiprocessing
import cv2
import os
import time


def get_img(input_dir):
  img_paths = []
  for (path,dirname,filenames) in os.walk(input_dir):
    for filename in filenames:
      img_paths.append(path+'/'+filename)
  print("img_paths:",img_paths)
  return img_paths


def cut_img(img_paths,output_dir):
  imread_failed = []
  try:
    img = cv2.imread(img_paths)
    height, weight = img.shape[:2]
    if (1.0 * height / weight) < 1.3:    # 正常发票
      cropImg = img[50:200, 700:1500]   # 裁剪【y1,y2:x1,x2】
      cv2.imwrite(output_dir + '/' + img_paths.split('/')[-1], cropImg)
    else:                  # 卷帘发票
      cropImg_01 = img[30:150, 50:600]
      cv2.imwrite(output_dir + '/' + img_paths.split('/')[-1], cropImg_01)
  except:
    imread_failed.append(img_paths)
  return imread_failed


def main(input_dir,output_dir):
  img_paths = get_img(input_dir)
  scale = len(img_paths)

  results = []
  pool = multiprocessing.Pool(processes = 4)
  for i,img_path in enumerate(img_paths):
    a = "#"* int(i/10)
    b = "."*(int(scale/10)-int(i/10))
    c = (i/scale)*100
    results.append(pool.apply_async(cut_img, (img_path,output_dir )))
    print('{:^3.3f}%[{}>>{}]'.format(c, a, b)) # 进度条(可用tqdm)
  pool.close()            # 调用join之前,先调用close函数,否则会出错。
  pool.join()             # join函数等待所有子进程结束
  for result in results:
    print('image read failed!:', result.get())
  print ("All done.")



if __name__ == "__main__":
  input_dir = "D:/image_person"    # 读取图片目录表
  output_dir = "D:/image_person_02"  # 保存截取的图像目录
  main(input_dir, output_dir)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python返回真假值(True or False)小技巧
Apr 10 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
Python对象与引用的介绍
Jan 24 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
学习python的前途 python挣钱
Feb 27 Python
python实现nao机器人手臂动作控制
Apr 29 Python
numpy linalg模块的具体使用方法
May 26 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
python manage.py runserver流程解析
Nov 08 Python
从python读取sql的实例方法
Jul 21 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 #Python
Python自动化完成tb喵币任务的操作方法
Oct 30 #Python
Flask框架 CSRF 保护实现方法详解
Oct 30 #Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 #Python
python基于K-means聚类算法的图像分割
Oct 30 #Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 #Python
Python文件路径名的操作方法
Oct 30 #Python
You might like
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
angular多语言配置详解
2019/05/16 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
python使用pymysql实现操作mysql
2016/09/13 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
读群众路线心得体会
2014/03/07 职场文书
年终晚会主持词
2014/03/25 职场文书
2015年招聘工作总结
2014/12/12 职场文书
新教师教学工作总结
2015/08/12 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
linux目录管理方法介绍
2022/06/01 Servers