这篇文章将为大家详细讲解有关怎么在Python中使用opencv截取图片,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2.面向对象,与其他主要的语言如C++和Java相比, Python以一种非常强大又简单的方式实现面向对象编程。3.可移植性,Python程序无需修改就可以在各种平台上运行。4.解释性,Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。5.开源,Python是 FLOSS(自由/开放源码软件)之一。
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
截取效果如下:
方法一适合少量图片裁剪或做测试时使用,无法批量裁剪。
方法二适合多个样本中的目标具有相似的位置,可以批量裁剪但是若位置不相似则不适用。
方法三用形态学手法获取轮廓再根据bounding box裁剪,可以批量处理,但是裁剪效果一般,能不能得到物体全看之前的轮廓获取的是否清晰,但并不是每个图片中的目标都能清晰地获取到轮廓。
方法四用YOLO也是根据boundingbox裁剪,可以批量处理但是需要人工标注成本,而且该成本根据模型的准确性略有起伏,但由于yolo训练很快,所以该方法是个不错的裁剪图片的手段。
关于怎么在Python中使用opencv截取图片就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。