iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Python+opencv裁剪/截取图片的几种方式
  • 826
分享到

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

2024-04-02 19:04:59 826人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

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

前言

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

一、手动单张裁剪/截取

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裁剪图片内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Python+opencv裁剪/截取图片的几种方式

本文链接: https://www.lsjlt.com/news/125007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Python+opencv裁剪/截取图片的几种方式
    前言 在计算机视觉任务中,如图像分类,图像数据集必不可少。自己采集的图片往往存在很多噪声或无用信息会影响模型训练。因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响。...
    99+
    2024-04-02
  • Python实现图片裁剪的两种方式——P
    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧。 首先,我们有一张原始图片,如下图所示: 原始图片...
    99+
    2023-01-31
    两种 方式 图片
  • C++ OpenCV裁剪图片时发生报错的解决方式
    目录从相机获取图像时直接处理会报错,读取本地视频不会报错对本地视频进行裁剪不会报错,对相机实时获取的帧进行裁剪会报错总结从相机获取图像时直接处理会报错,读取本地视频不会报错 原代码 ...
    99+
    2024-04-02
  • Python批量裁剪图片的思路详解
    目录需求思路程序测试需求 我的需求是批量裁剪某一文件夹下的所有图片,并指定裁剪宽高。 思路 1、 先使用PIL.Image.size获取输入图片的宽高。2、宽高除以2得到中心点坐标3...
    99+
    2024-04-02
  • android实现图片裁剪的两种方法
    两种android图片裁剪方式,供大家参考,具体内容如下 一、相机拍完照之后利用系统自带裁剪工具进行截取 public static void cropImage(Activit...
    99+
    2024-04-02
  • python中opencv通过4坐标剪裁图片的示例分析
    这篇文章主要介绍python中opencv通过4坐标剪裁图片的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文主要介绍了python opencv通过4坐标剪裁图片,分享给大家,具体如下:效果展示, 裁剪出...
    99+
    2023-06-15
  • 三分钟教会你用Python+OpenCV批量裁剪xml格式标注的图片
    目录前言xml文件格式代码思想完整代码效果展示总结前言 在目标检测中,数据集常常使用labelimg标注,会生成xml文件。本文旨在根据xml标注文件来裁剪目标,以达到去除背景信息的...
    99+
    2024-04-02
  • Java实现图片裁剪功能的示例详解
    目录前言Maven依赖代码验证一下前言 本文提供将图片按照自定义尺寸进行裁剪的Java工具类,一如既往的实用主义。 Maven依赖 <dependency>...
    99+
    2024-04-02
  • Python _取log的几种方式
    1. 使用.logfile 方法 #!/usr/bin/env python import pexpect import sys host="146.11.85.xxx" user="inteuser" password="xxx...
    99+
    2023-01-31
    几种 方式 Python
  • Python开根号的几种方式详解
    目录前言方法一PS:Python如何求平方根?Python巧妙开根号的三种方法一、开根号的方法前言 使用Python中的自带库math、自带函数pow和自带库cmath来对数字进行开...
    99+
    2023-01-12
    Python开根号 Python求平方根
  • 基于python读取图像的几种方式汇总
    目录本文介绍几种基于python的图像读取方式:基于PIL库的图像读取、保存和显示基于matplotlib的图像读取、显示和保存基于scikit-image的图像读取、保存和显示基于...
    99+
    2024-04-02
  • python读取并显示图片的三种方法(opencv、matplotlib、PIL库)
    前言 在进行图像处理时,经常会用到读取图片并显示出来这样的操作,所以本文总结了python中读取并显示图片的3种方式,分别基于opencv、matplotlib、PIL库实现,并给...
    99+
    2024-04-02
  • 详解python中读取和查看图片的6种方法
    目录1 OpenCV2 imageio3 PIL4 scipy.misc5 tensorflow6 skimage本文主要介绍了python中读取和查看图片的6种方法,分享给大家,具...
    99+
    2024-04-02
  • Python图片存储和访问的三种方式详解
    目录前言数据准备一个可以玩的数据集图像存储的设置LMDBHDF5单一图像的存储存储到 磁盘存储到 LMDB存储 HDF5存储方式对比多个图像的存储多图像调整代码准备数据集对比单一图像...
    99+
    2024-04-02
  • Vue显示图片的几种方式小结
    目录前言使用原生img标签使用ElementUI的Avatar总结前言 最近在做自己的项目,有这么一个需求,用户列表需要展示用户的头像,之前一直没有处理,趁着这次机会,正好分享下我的...
    99+
    2023-02-05
    Vue显示图片 Vue图片显示
  • C++ OpenCV中几种基本的图像处理方式
    目录一、图像显示1、OpenCV的命名空间2、Mat类简析3、图像的载入:imread()函数4、imshow()函数二、图像腐蚀和膨胀三、图像模糊四、canny边缘检测虽然单单要做...
    99+
    2024-04-02
  • Python Requests使用Cookie的几种方式详解
    目录前言一、通过headers参数使用二、通过cookies参数使用三、通过Session会话使用方式0:自动设置方式1:通过key设置方式2:通过set 方法设置方式3:通过 ad...
    99+
    2023-08-08
    python requests cookie python cookie
  • 详解Android GLide图片加载常用几种方法
    目录缓存浅析GLide图片加载方法图片加载周期图片格式(Bitmap,Gif)缓存集成网络框架权限占位符淡入效果变换启动页/广告页banner固定宽高圆角圆形总结缓存浅析 为啥要做缓...
    99+
    2022-11-16
    Android GLide图片加载 Android GLide
  • Python OpenCV实现图片预处理的方法详解
    目录一、图片预处理1.1 边界填充(padding)1.2 融合图片(mixup)1.3 图像阈值二、滤波器2.1 均值滤波器2.2 方框滤波器2.3 高斯滤波器2.4 中值滤波2....
    99+
    2024-04-02
  • react 项目中引入图片的几种方式
    img标签引入图片 因为react其实是通过js的reader函数渲染的页面,所以直接写src=“路径”是无法引入图片 我们可以像引入模块一样引入图片 import img ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作