使用OpenCV扩大图像数据库——图像随机

xiaoxiao2025-06-02  16

利用随机剪裁可进行图像数据库的扩大,不同的剪裁位置能够提供更多的数据样本。

编程思路

确定需要的图片的大小在左上角计算出剪裁后剩下的长度在左上角区域中取得一点作为起始点从中截取所需要的面积

原始代码

import cv2 import random img=cv2.imread("lena.jpg") width,height,depth= img.shape img_width_box=width*0.2 img_height_box=height*0.2 for i in range(9): start_pointX=random.uniform(0,img_width_box) start_pointY=random.uniform(0,img_height_box) copyImg=img[start_pointX:200,start_pointY:200] cv2.imshow("test",copyImg) cv2.waitKey(0)

发现并不能运行,并报错:

... width,height,depth= img.shape AttributeError: 'NoneType' object has no attribute 'shape'

并发现img.shape不存在,通过网上查阅资料得知:读入图片时需要添加路径,否则返回值为None,于是进一步修改代码有:

import cv2 import random img=cv2.imread("d:/testdata/wyb1.jpg") width,height,depth= img.shape img_width_box=width*0.2 img_height_box=height*0.2 for i in range(9): start_pointX=random.uniform(0,img_width_box) start_pointY=random.uniform(0,img_height_box) copyImg=img[start_pointX:200,start_pointY:200] cv2.imshow("test",copyImg) cv2.waitKey(0)

运行时出现如下错误:

... copyImg=img[start_pointX:200,start_pointY:200] TypeError: slice indices must be integers or None or have an __index__ method

通过监测变量值发现,问题出现在这两句话:

start_pointX=random.uniform(0,img_width_box) start_pointY=random.uniform(0,img_height_box)

只要将其改为

start_pointX=int(random.uniform(0,img_width_box)) start_pointY=int(random.uniform(0,img_height_box))

即可成功编译,究其原因,由于生成随机为浮点数,进行类型转换为int类型即可成功运行。

最终代码

import cv2 import random img=cv2.imread("d:/testdata/wyb1.jpg") width,height,depth= img.shape img_width_box=width*0.2 img_height_box=height*0.2 for i in range(9): start_pointX = int(random.uniform(0, img_width_box)) start_pointY = int(random.uniform(0, img_height_box)) copyImg=img[start_pointX:200,start_pointY:200] cv2.imshow("test",copyImg) cv2.waitKey(0)

进一步改进

编程思路

为了更好的在一定范围内进行截取,增加右下角区域,用于一定范围内的图像截取,相关参数可根据需要自行修改。

import cv2 import random img=cv2.imread("d:/testdata/wyb1.jpg") print (img.shape) width,height,depth= img.shape img_width_box_up=width*0.2 img_height_box_up=height*0.2 img_width_box_down=width*0.8 img_height_box_down=height*0.8 print(img_width_box_up) print(img_height_box_up) for i in range(9): start_pointX=int(random.uniform(0,img_width_box_up)) start_pointY=int(random.uniform(0,img_height_box_up)) end_pointX=int(random.uniform(img_width_box_down,width)) end_pointY=int(random.uniform(img_height_box_down,height)) print(start_pointX) print(start_pointY) copyImg=img[start_pointX:end_pointX,start_pointY:end_pointY] cv2.imshow("test",copyImg) print(copyImg.shape) cv2.waitKey(0)
转载请注明原文地址: https://www.6miu.com/read-5031137.html

最新回复(0)