使用 python 生成裁剪图像时出错

Posted

技术标签:

【中文标题】使用 python 生成裁剪图像时出错【英文标题】:Error generating cropped images using python 【发布时间】:2021-04-08 17:18:58 【问题描述】:

我正在做一些机器学习,需要调整一些图像的大小以适应数据集的其余部分。我对图像进行了一些草率的裁剪,得到的结果让我感到困惑。 该代码非常基本,如下所示。我遇到的问题是,有时我会得到不可读且无法打开的图像,其中一些只有 40 个字节,而另一些则大小更合理。这些文件的类型为“.pgm”,并被保存为“.pgm”。

from matplotlib import pyplot
from matplotlib.image import imread
import cv2
import matplotlib.pyplot as plt
import os
import random

root = "/non-pedestrian/"
imageDir = root + "NonPedestrians/"
outDir = root + "cropped/"
xSize, ySize = (48, 96)
offset = 10 #Nothing good happends at the edges

#5000 images, 15000 crops
for idx, fname in enumerate(os.listdir(imageDir)):
    if idx >= 5000:
        break
    path = imageDir + fname
    img = cv2.imread(path, -1)
    for i in range(3):
        width, height = img.shape[:2]
        cropXmin = random.randint(offset, width - xSize - offset)
        cropYmin = random.randint(offset, height - ySize - offset)
        cropXmax = cropXmin + xSize
        cropYmax = cropYmin + ySize
        if cropYmax - cropYmin < ySize or cropXmax - cropXmin < xSize:
            # This has never happend
            print("wtf?")
            print(cropXmin, cropYmin, cropXmax, cropYmax, width, height)
            time.sleep(1000)
    
        cropped = img[cropYmin:cropYmax, cropXmin:cropXmax] # y0 : y1 , x0 : x1 
        cv2.imwrite(outDir + ":06d.pgm".format(idx + i * 5000), cropped)
        print(":06d.pgm".format(idx + i * 5000))

【问题讨论】:

如果您希望人们帮助您,请为他们提供帮助......不要在没有解释您的意思的情况下使用 “草率裁剪” 之类的术语。不要显示未注释的代码。尝试使用调试器。尝试展示你得到的结果。试着解释你真正想要达到的目标。 【参考方案1】:

您切换了widthheight。 应该是:height, width = img.shape[:2]

如果您不关心颜色,可以使用img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)。 所有pgm 图像都必须是灰度的?

我也可以建议保护,以防输入图像太小:

if (cropXmin >= 0) and (cropYmin >= 0) and (cropXmax <= width) and (cropYmax <= height):   
    cropped = img[cropYmin:cropYmax, cropXmin:cropXmax] # y0 : y1 , x0 : x1 

这是一个应用单个图像和单个裁剪的代码示例:

xSize, ySize = (48, 96)

offset = 10 # Nothing good happens at the edges

# In case image is colored it's converted to Grayscale, and the crop is going to work.
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)  # Read input image as Graysacle

# height comes before width
height, width = img.shape[:2]
cropXmin = random.randint(offset, width - xSize - offset)
cropYmin = random.randint(offset, height - ySize - offset)
cropXmax = cropXmin + xSize
cropYmax = cropYmin + ySize

# Protection - required if input image is too small
if (cropXmin >= 0) and (cropYmin >= 0) and (cropXmax <= width) and (cropYmax <= height):   
    cropped = img[cropYmin:cropYmax, cropXmin:cropXmax] # y0 : y1 , x0 : x1 

【讨论】:

哦,我很愚蠢。不知道我怎么会犯这样的错误......非常感谢! :)

以上是关于使用 python 生成裁剪图像时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# System.Drawing 生成缩略图时居中裁剪图像

如何在Java中裁剪调整大小的图像?

Tensorflow:尝试迁移学习时出错:JPEG 数据或裁剪窗口无效

使用 sf::st_crop() 和 raster::crop() 裁剪光栅堆栈时出错

使用 Python Pillow 裁剪图像

Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)