用Python+opencv实现裁剪图片的方式有哪些,分别怎样
Admin 2022-06-13 群英技术资讯 501 次浏览
在计算机视觉任务中,如图像分类,图像数据集必不可少。自己采集的图片往往存在很多噪声或无用信息会影响模型训练。因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响。本文介绍几种图片裁剪的方式,供大家参考。
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检测结果裁剪,并将结果保存用于其他分类任务中。
代码如下:
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
截取效果如下:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了Python五子棋小游戏实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要为大家介绍了python引入requests报错could not be resolved解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了python实现画桃心表白的代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要为大家介绍了Python常用的内置函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
这篇文章主要介绍了Python三数之和的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008