• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解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)
    

    三、、用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
    

    截取效果如下:

    总结

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

    您可能感兴趣的文章:
    • Python OpenCV实现裁剪并保存图片
    • python通过opencv实现图片裁剪原理解析
    • Python实现图片裁剪的两种方式(Pillow和OpenCV)
    • Python OpenCV图像指定区域裁剪的实现
    • 使用Python和OpenCV检测图像中的物体并将物体裁剪下来
    • python opencv对图像进行旋转且不裁剪图片的实现方法
    • python opencv实现目标区域裁剪功能
    上一篇:解决pycharm临时打包32位程序的问题
    下一篇:python+opencv图像分割实现分割不规则ROI区域方法汇总
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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