Рекурсивно конвертировать файлы изображений в другую папку назначения - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь рекурсивно преобразовать все файлы в папке img в оттенки серого и сохранить результаты в папке imgGray,

Но в папке назначения:

Я получение только первого изображения, преобразованного из каждого подкаталога (A,B ...), вот как выглядит дерево:

__img__A____A1.jpg
|    |   |__A2.jpg
|    |   .
|    |   .
|    |   .__An.jpg
|    |
|    |___B__B1.jpg
|    |   |__B2.jpg
|    |   .
|    |   .
|    |   .__Bn.jpg
|
|__imgGray__A__A1.jpg
     |      
     |
     |______B__B1.jpg

Я не уверен, правильно ли я использую функцию glob.glob(os.path.join(x[0],"*.jpg"))? или какая часть кода неверна?

Ниже приведен код, который я подготовил для этой задачи:

import cv2
import os,glob,re
from os import listdir,makedirs
from os.path import isfile,join

pwd = os.getcwd()
path = os.path.join(pwd,'img') # Source Folder
dstpath = os.path.join(pwd,'imgGray') # Destination Folder

for x in os.walk(path):
    y = x[0][len(path):]
    subFolderDest = dstpath+y
    try:
        os.mkdir(subFolderDest)
    except:
        print ("Directory already exist, images will be written in same subfolder:"+subFolderDest)
        variable = input('continue? y/n: ')
        if variable == 'n':
            exit(0)
    # Folder won't used
    files = [f for f in listdir(x[0]) if isfile(join(x[0],f))] 
    print(x[0]+str(len(files)))
    for image in files:
        try:
            img = cv2.imread(os.path.join(x[0],image))
            gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
            subFolderDest = join(subFolderDest,image)
            cv2.imwrite(subFolderDest,gray)
        except:
            print ("{} is not converted".format(image))

    for fil in glob.glob(os.path.join(x[0],"*.jpg")):
        try:
            image = cv2.imread(fil) 
            gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # convert to greyscale
            cv2.imwrite(os.path.join(subFolderDest,fil),gray_image)
        except:
            print('{} is not converted')

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Эта упрощенная логика c для обхода дерева каталогов должна сработать.

Я исключил реальную функцию преобразования, ваш код должен работать для нее.

import os

def convert_image(source_path, dest_path):
    print(f'Would convert {source_path} -> {dest_path}')

pwd = os.getcwd()
source_dir = os.path.join(pwd, 'img')
dest_dir = os.path.join(pwd, 'imgGray')

for dirpath, dirnames, filenames in os.walk(source_dir):
    for filename in filenames:
        if filename.endswith('.png'):
            source_path = os.path.join(dirpath, filename)
            dest_path = os.path.join(dest_dir, os.path.relpath(dirpath, source_dir), filename)
            os.makedirs(os.path.dirname(dest_path), exist_ok=True)
            convert_image(source_path, dest_path)

Запустив это из /something, он печатает

Would convert /something/img/a/4.png -> /something/imgGray/a/4.png
Would convert /something/img/a/1.png -> /something/imgGray/a/1.png
Would convert /something/img/c/6.png -> /something/imgGray/c/6.png
Would convert /something/img/c/3.png -> /something/imgGray/c/3.png
Would convert /something/img/b/5.png -> /something/imgGray/b/5.png
Would convert /something/img/b/2.png -> /something/imgGray/b/2.png
1 голос
/ 05 марта 2020

Отредактировав все решение, я получил следующий код, успешно работающий:

import cv2
import os,glob,re
from PIL import Image
from os import listdir,makedirs
from os.path import isfile,join    

def convert_image(source_path, dest_path):
    image = cv2.imread(source_path)
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    
    cv2.imwrite(dest_path, image_gray)
    print(f'Would convert {source_path} -> {dest_path}')

pwd = os.getcwd()
source_dir = os.path.join(pwd, 'img') # Source Folder
dest_dir = os.path.join(pwd, 'imgGray') # Destination Folder

for dirpath, dirnames, filenames in os.walk(source_dir):
    for filename in filenames:
        if filename.endswith('.jpg'):
            source_path = os.path.join(dirpath, filename)
            dest_path = os.path.join(dest_dir, os.path.relpath(dirpath, source_dir), filename)
            os.makedirs(os.path.dirname(dest_path), exist_ok=True)
            convert_image(source_path, dest_path)
...