Запись нескольких файлов изображений в определенную папку - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть изображения, которые я прочитал позже в определенном формате, мне нужно найти контуры и записать все контурные изображения в указанную выходную папку. Затем я должен создать подпапку под именем файла и записать сегментированные изображения в соответствующие папки. До сих пор я могу читать изображения в указанном формате, в то время как я могу найти контуры, но не могу записать все эти изображения контуров в определенную папку.

import cv2
import os, os.path

print (cv2.__version__)

imageDir = "C:/Users/animesh.singh/Downloads/Assignment/" #specify your path here

image_path_list = []

valid_image_extensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff"] 

#specify your valid extensions here
valid_image_extensions = [item.lower() for item in valid_image_extensions]

for file in os.listdir(imageDir):

extension = os.path.splitext(file)[1]

    if extension.lower() not in valid_image_extensions:
        continue
    image_path_list.append(os.path.join(imageDir, file))

for imagePath in image_path_list:

    img = cv2.imread(imagePath)

    if img is None:
        continue

    cv2.imshow(imagePath, img)

    key = cv2.waitKey(0)
    if key == 27: # escape
        break

cv2.destroyAllWindows()


for imagePath in image_path_list:

    ret, thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV)
    edges = cv2.Canny(img, 100, 200)

    cv2.imshow(imagePath,thresh)
    cv2.imshow(imagePath,edges)

    key = cv2.waitKey(0)

    cv2.destroyAllWindows()


contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:

      cv2.drawContours(img, [contour], 0, (0, 0, 255), 3)

cv2.imwrite('C:/Users/animesh.singh/Downloads/Assignment/contour_images/1 (103)_N_0_0_CARD_Contour_Output.jpg', img)

Я хочу:

• Считайте все изображения из папки, которые принимают все форматы изображений, кроме PDF.

• Найти контуры и записать все контурные изображения в указанную выходную папку.

• Создайте подпапку под именем файла и запишите сегментированные изображения в соответствующие папки.

Входные изображения:

1

Image_1

2:

Image_2

3

Image_3

1 Ответ

0 голосов
/ 12 апреля 2019

То, что в данный момент делает ваш код, это то, что он рисует линию контуров на изображении, а затем сохраняет его.Он делает это только для последнего изображения в image_path_list, и, поскольку imwrite жестко запрограммирован, это всегда будет приводить только к 1 изображению.

Это процесс, который вы должны выполнить для каждого изображения: - создатьновая папка - найдите контуры на изображении - для каждого контура возьмите boundingRect, поле, содержащее контур - используйте размеры ограничивающего объекта для создания подизображения - сохраните подизображение с именем переменной.

Код ниже показывает этот процесс для 1 изображения, вы можете реализовать его в for imagePath in image_path_list:

Результат:
enter image description here

Код:

    import cv2
    import numpy as np 
    import os
    from os import listdir

    # get the filenames in directory
    basepath = "C:/Users/Desktop/Images/"
    files = listdir(basepath)
    # declare valid filtypes
    valid_image_extensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff"] 

    for name in files:
            # check if it is a valid filetype
            filename, file_extension = os.path.splitext(name)
            if file_extension in valid_image_extensions:
                    # create a folder for this image
                    path = basepath+filename
                    if not os.path.exists(path):
                            os.makedirs(path)
                    # load image in grayscale
                    img = cv2.imread(basepath+name,0)
                    # threshold image
                    ret,mask = cv2.threshold(img,240,255,cv2.THRESH_BINARY_INV)
                    # find contours
                    ret, contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

                    for i in range(len(contours)):
                            # get contour
                            cnt = contours[i]
                            # get the dimensions of the boundingRect
                            x,y,w,h = cv2.boundingRect(cnt)
                            # create a subimage based on boundingRect
                            sub_img = img[y:y+h,x:x+w]
                            # save image of contour with indexed name
                            cv2.imwrite(path+"\contour_"+str(i)+".jpg", sub_img)
...