Как написать несколько изображений без наложения - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь написать контурные изображения, но я получаю только одно изображение в качестве вывода. У меня было 3 изображения, и я хочу написать все 3 вывода контура изображения.

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

Я пытался реализовать os.path.split, но до сих пор безуспешно

import sys
import glob,os
import cv2
class Imageprocessing:
    def readImages(inputFolder):
        ext = ['.png', '.jpg', '.gif', '.jpeg', '.tif', '.tiff']    # Add image formats here
        files = []
        path = inputFolder + "\\*.*"
        #print (path)
        files = glob.glob(path)
        #[files.extend(glob.glob(inputFolder + '*.' + e)) for e in ext]
        #print(files)
        imageFiles=[]
        for i in files:
            exten=os.path.splitext(i)[1]
            if exten in ext:
                imageFiles.append(i)
        return imageFiles

    def processImage(imageFiles):
        for imagePath in imageFiles:
            print(imagePath)
            image = cv2.imread(imagePath)
            cv2.imshow("1",image)
            cv2.waitKey()
            ret, thresh = cv2.threshold(image,0,255,cv2.THRESH_BINARY_INV)
            edges = cv2.Canny(thresh, 100, 200)
            #cv2.imshow('original_image',image)
            #cv2.imshow('2',thresh)
            #cv2.imshow('3',edges)
            #cv2.waitKey()
            #cv2.destroyAllWindows()
            contours,hierachy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
            for contour in contours:
                cv2.drawContours(image, [contour], -1, (0, 0, 255), 3)
            cv2.imwrite(sys.argv[1]+".jpg", image)

imageFiles = Imageprocessing.readImages(sys.argv[1])
Imageprocessing.processImage(imageFiles)

1

1

2

2

3:

3

1 Ответ

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

Как вы и просили, приведенный ниже код будет «Создать подпапку под именем имени файла и записать сегментированные изображения в соответствующие папки».

import cv2
import numpy as np
import glob,os,sys
class Imageprocessing:  
    def readImages(inputFolder):
        ext = ['.png', '.jpg', '.gif', '.jpeg', '.tif', '.tiff']
        files = []
        path = inputFolder + "/*.*"
        files = glob.glob(path)
        imageFiles=[]
        for i in files:
                exten=os.path.splitext(i)[1]
                if exten in ext:
                        imageFiles.append(i)
        return imageFiles

    def processImage(imageFiles):
        for imagePath in imageFiles:
            img_name = os.path.splitext(os.path.basename(imagePath))[0]
            new_folder = sys.argv[2]+'/'+img_name+'/'
            os.makedirs(new_folder, exist_ok=True)

            image = cv2.imread(imagePath)
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
            kernel = np.ones((10, 0), np.uint8)
            dilated_img = cv2.dilate(thresh, kernel, iterations=0)
            img, contours, hierarchy = cv2.findContours(dilated_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            sorted_ctrs = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])

            for i, ctr in enumerate(sorted_ctrs):
                    x, y, w, h = cv2.boundingRect(ctr)
                    cv2.drawContours(image, [ctr], -1, (0, 0, 255), 3)
                    roi = image[y:y + h, x:x + w]
                    if w > 3 and h > 10:
                            cv2.imwrite(new_folder+'{}.png'.format(i), roi)

            cv2.imshow('contours', image)
            cv2.waitKey(0)

imageFiles = Imageprocessing.readImages(sys.argv[1])
Imageprocessing.processImage(imageFiles)
# press 'esc' to close the image window
# execute as : python file.py path\to\input path\to\output 
# each argument seperated by space

это создаст папку для каждого имени файла в месте, указанном как sys.argv[2] как сегментированные изображения с контурами, нарисованными поверх.

enter image description here enter image description here

Вы можете настроить 'w' и 'h' в if w > 3 and h > 10:, или ядро, или значение итераций в 'cv2.dlate', чтобы настроить этот код для различных размеров символов в вашем файле изображения. (в настоящее время код настроен на предоставленную вами ссылку на изображение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...