详解Python+opencv裁剪/截取图片的几种方式

 更新时间:2022年01月20日 14:15:20   作者:18岁小白想成大牛  
这篇文章主要介绍了详解Python+opencv裁剪/截取图片的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在计算机视觉任务中,如图像分类,图像数据集必不可少。自己采集的图片往往存在很多噪声或无用信息会影响模型训练。因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响。本文介绍几种图片裁剪的方式,供大家参考。

一、手动单张裁剪/截取

selectROI:选择感兴趣区域,边界框框选x,y,w,h

selectROI(windowName, img, showCrosshair=None, fromCenter=None):
. 参数windowName:选择的区域被显示在的窗口的名字
. 参数img:要在什么图片上选择ROI
. 参数showCrosshair:是否在矩形框里画十字线.
. 参数fromCenter:是否是从矩形框的中心开始画

要截取的原图如下:

在这里插入图片描述

截取效果如下:

在这里插入图片描述

截取之后按回车Enter保存:

在这里插入图片描述

完整代码如下:

import cv2

img = 'D:/anaconda3/JupyterNotebookFile/images/dogs_and_cats.jpg'
img = cv2.imread(img)
cv2.imshow('original', img)

# 选择ROI
roi = cv2.selectROI(windowName="original", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
print(roi)

# 显示ROI并保存图片
if roi != (0, 0, 0, 0):
    crop = img[y:y+h, x:x+w]
    cv2.imshow('crop', crop)
    cv2.imwrite('D:/anaconda3/JupyterNotebookFile/images/dogs_and_cats_crop.jpg', crop)
    print('Saved!')

# 退出
cv2.waitKey(0)
cv2.destroyAllWindows()

读者根据自己的图片目录修改目标图片目录和要写入的目录。

二、根据图片的位置坐标进行裁剪/截取

在这里插入图片描述

这是一张432×432大小的图片,左上角坐标为(0,0).

import cv2
im = cv2.imread('图片路径')

在用cv2.imread()默认读取三通道RGB图像后,会返回一个三维数组。同时,可用im[h,w]的形式来截取图片中的某个部分。比如中间柴犬的位置相对左上角坐标原点为,从上到下为190-380,从左往右为180-260。这样就可以通过坐标的相对位置来裁剪/截取目标图像了。

完整代码如下:

import cv2
import os

file_path = 'D:/anaconda3/JupyterNotebookFile/images/dogs_and_cats.jpg'
out_file_name = 'dogs_and_cats_cropp'

im = cv2.imread(file_path)
im = im[190:380,180:260]
save_path = r'D:/anaconda3/JupyterNotebookFile/images'
save_path_file = os.path.join(save_path,out_file_name+'.jpg')
cv2.imwrite(save_path_file,im)

截取后的图片效果:

在这里插入图片描述

若很多个图片数据具有相似的位置,则可以通过遍历文件的方式批量裁剪/截取,代码如下:

import cv2
import os

def clip_image(filelist,i,im_path):  
	'''
	filelist:文件夹路径
	i:批量保存的图片文件名,用数字表示
	im_path:图片路径
	'''  
    for file in filelist:
        file_path=os.path.join(im_path,file)
        im=cv2.imread(file_path)
        #[h,w]根据自己图片中目标的位置修改
        im=im[190:380,180:260]                      
        save_path = r'D:/anaconda3/JupyterNotebookFile/images'
        save_path_file = os.path.join(save_path,out_file_name+'.jpg')           
        cv2.imwrite(save_path_file,im)            
        i=i+1

传参并测试:笔者用的jupyter notebook,其他编译器写在main()中

i=0
im_path = r'D:/anaconda3/JupyterNotebookFile/images/dogs_and_cats.jpg'
filelist = os.listdir(im_path)
clip_image(filelist,i,im_path)

三、根据xml文件截取/裁剪目标

详见文章:三分钟学会用Python+OpenCV批量裁剪xml标注文件

四、opencv获取边缘并根据bounding box截取/裁剪目标

详见另一篇文章。

五、用YOLO目标检测框裁剪并批量保存

同一类图片数据具有相似的特征,标注少量的图片训练YOLO提升其定位目标的能力,可以将所有的测试数据根据YOLO检测结果裁剪,并将结果保存用于其他分类任务中。

代码如下:

from PIL import Image

from yolo import YOLO
import os
import cv2
import numpy as np
yolo = YOLO()

'''
yolo抠图,截取目标
'''
j=0
#预测图片所在路径
path = 'E:/crop_all'
imgdir = os.listdir(path)
for dir in imgdir:
    img_path = os.path.join(path,dir)
    image = Image.open(img_path)
    #print(image)
    crop_image = cv2.imread(img_path)
    #print(crop_image[0])
    boxes = yolo.detect_image(image)
    #print(boxes)

    top = boxes[0][0]
    left = boxes[0][1]
    bottom = boxes[0][2]
    right = boxes[0][3]

    top = top - 5
    left = left - 5
    bottom = bottom + 5
    right = right + 5

    # 左上角点的坐标
    top = int(max(0, np.floor(top + 0.5).astype('int32')))
    left = int(max(0, np.floor(left + 0.5).astype('int32')))
    # 右下角点的坐标
    bottom = int(min(np.shape(image)[0], np.floor(bottom + 0.5).astype('int32')))
    right = int(min(np.shape(image)[1], np.floor(right + 0.5).astype('int32')))


    croped_region = crop_image[top:bottom, left:right]
    
    #裁剪图片存放目录
    baocun = r'E:/crop_all_finish'
    save_path = os.path.join(baocun, str(j) + '.bmp')
    cv2.imwrite(save_path, croped_region)
    j = j + 1

截取效果如下:

在这里插入图片描述

总结

  • 方法一适合少量图片裁剪或做测试时使用,无法批量裁剪。
  • 方法二适合多个样本中的目标具有相似的位置,可以批量裁剪但是若位置不相似则不适用。
  • 方法三用形态学手法获取轮廓再根据bounding box裁剪,可以批量处理,但是裁剪效果一般,能不能得到物体全看之前的轮廓获取的是否清晰,但并不是每个图片中的目标都能清晰地获取到轮廓。
  • 方法四用YOLO也是根据boundingbox裁剪,可以批量处理但是需要人工标注成本,而且该成本根据模型的准确性略有起伏,但由于yolo训练很快,所以该方法是个不错的裁剪图片的手段。

到此这篇关于详解Python+opencv裁剪/截取图片的几种方式的文章就介绍到这了,更多相关opencv裁剪图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Python多处理库处理3D数据详解

    利用Python多处理库处理3D数据详解

    本文将介绍处理大量数据时非常方便的工具,例如tqdm与 multiprocessing​imap​​一起使用、并行处理档案、绘制和处理3D数据等,感兴趣的小伙伴可以了解一下
    2021-12-12
  • Python使用pip freeze的完整指南

    Python使用pip freeze的完整指南

    pip freeze 是 Python 包管理器 pip 的一个非常有用的命令,它可以列出当前 Python 环境中已经安装的所有包及其版本,本文将详细介绍 pip freeze 的用途及其在不同场景下的使用方法,需要的朋友可以参考下
    2024-08-08
  • Python-jenkins模块获取jobs的执行状态操作

    Python-jenkins模块获取jobs的执行状态操作

    这篇文章主要介绍了Python-jenkins模块获取jobs的执行状态操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python 3.11.0下载安装并使用help查看模块信息的方法

    Python 3.11.0下载安装并使用help查看模块信息的方法

    本文给大家介绍Python 3.11.0下载安装并使用help查看模块信息的相关知识,首先给大家讲解了Python 3.11.0下载及安装紧接着介绍了在命令行使用help查看模块信息的方法,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • jupyter notebook 多行输出实例

    jupyter notebook 多行输出实例

    这篇文章主要介绍了jupyter notebook 多行输出实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • PyCharm的设置方法和第一个Python程序的建立

    PyCharm的设置方法和第一个Python程序的建立

    今天小编就为大家分享一篇PyCharm的设置方法和第一个Python程序的建立,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解

    这篇文章主要给大家介绍了关于利用python如何求解物理学中的双弹簧质能系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Python实现自动生成请假条

    Python实现自动生成请假条

    这篇文章主要为大家详细介绍了如何实现用Python来批量生成请假条,这回既学了东西又做了事情,两不误!感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • Python图片视频超分模型RealBasicVSR的使用教程

    Python图片视频超分模型RealBasicVSR的使用教程

    这篇文章主要和大家分享一个有意思的模型:RealBasicVSR。这个模型可以实现图片或视频的超分处理,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • Pandas数据清洗的实现

    Pandas数据清洗的实现

    在处理数据的时候,需要对数据进行一个清洗过程,本文就来介绍一下Pandas数据清洗的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论