OpenCV中未维护图像序列

2024-10-05 14:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

使用OpenCV,我读取了文件夹的所有图像,然后将其转换为灰度,然后将所有转换后的图像保存到一个名为"binary image"的新文件夹中。但是,当我再次读取"binary image"文件夹中的所有图像以显示直方图时,"binary image"文件夹中的图像序列没有保持不变。直方图显示的是文件夹中的第19号图像,而不是第12号图像。但是柱状图的总数和它应该的一样好。如何维护图像序列

我如何阅读图像:

images1=[cv2.imread(file) for file in glob.glob(r"C:\Users\USER\Handcrafted dataset\binary_image/*.jpg")]

这就是我保存直方图图像的方式:

 dir1=r"C:\Users\USER\Handcrafted dataset\histogram"
for i,img in enumerate(images1):
    plt.figure(figsize=(5,5))
    plt.hist(img.ravel(),256,[0,256],label=str(np.mean(img)))
    plt.legend(loc="upper right")
    plt.savefig(dir1+"\\"+str(i)+".png")
    print(i)

    plt.show()

要保存灰度图像,请执行以下操作:

di=r"C:\Users\USER\Handcrafted dataset\binary_image"
for i,img in enumerate(images):
    img = rgb2gray(img)
    plt.figure(figsize=(5,5))
    print(i)
    plt.imshow(img ,cmap='gray')
    io.imsave(di+"\\"+str(i)+".jpg",img)

起初,当我读取图像时,图像名称是随机的,但在转换为灰度后,我将图像保存在"binary image"文件夹中,并从0重命名为51。这意味着0.jpg, 1.jpg连续。在这之后,为了显示直方图,我使用了binay_图像文件夹,在那里像我前面提到的那样对图像进行了排序。但直方图是随机显示的


Tags: in图像image文件夹imgforplt直方图
1条回答
网友
1楼 · 发布于 2024-10-05 14:25:51

好的,有个问题。使用glob.glob()时,文件名没有特定的顺序。也就是说,除非您自己对它们进行排序或对顺序做一些改变,否则不能假定文件001.jpg位于002.jpg之前

因此,当你enumerate(images1)时,结果将与你描述的一样。数字和文件名不匹配

您可以做的最简单的操作是将sorted()添加到文件列表中:

images1=[cv2.imread(file) for file in sorted(glob.glob(r"C:\Users\..."))]

但是,这假设您的文件编号正确,并且中间没有丢失文件,例如006010以及007008009丢失


更新:一旦我看到文件名:0.jpg, 1.jpg我立即知道问题出在哪里。文件名按字典顺序排序,即1、10、11、12、。。。2,20,21,22我希望你明白我的意思

命名文件时,请添加前导零,它们的存在是有原因的,以保持文件的顺序,而不是:

plt.savefig(dir1+"\\"+str(i)+".png")

使用:

plt.savefig(os.path.join( dir1, "%06d.png" % i))

相关问题 更多 >