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实现partial改变方法默认参数
Aug 18 Python
跟老齐学Python之编写类之二方法
Oct 11 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python读写csv文件实例代码
Jul 05 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
python数据类型可变不可变知识点总结
Mar 06 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 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 array的学习笔记
2012/05/16 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
javascript整除实现代码
2010/11/23 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
python实现按任意键继续执行程序
2016/12/30 Python
python使用PyQt5的简单方法
2019/02/27 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
启动一个线程是用run()还是start()
2016/12/25 面试题
物理教师自荐信范文
2013/12/28 职场文书
年终考核评语
2014/01/19 职场文书
二审答辩状范文
2015/05/22 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
学生安全责任协议书
2016/03/22 职场文书
Python实现byte转integer
2021/06/03 Python
详解Java实践之建造者模式
2021/06/18 Java/Android