Как кластеризовать несколько изображений по имени в python - PullRequest
1 голос
/ 26 февраля 2020

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

Я знаю, как импортировать изображения, но моя проблема в том, как их разделить и отобразить их одновременно.

import cv2
import glop

image = [cv2.imread(img)for img in glop.glop ("c:/B/*.png")]

Например:

sa_01_ D F001 "D Type",

sa_01_ D F002 "D Type",

sa_01_ N B001 "N Тип",

sa_01_ N B002 "N Тип",

sa_01_ K P001 "K Тип",

sa_01_ K P002 "K Type".

Чтобы подвести итог моей проблемы:

  • Разделите изображение по имени.
  • Сохраните каждый тип в переменную.
  • Отображение нескольких изображений одновременно.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2020

Если я вас правильно понял, вы хотите создать словарь для каждого типа файла. Использование 7-го символа в качестве ключа, чтобы решить, какой файл входит в какую категорию, верно?

import os
from collections import defaultdict

arr = [x for x in os.listdir('.') if x.endswith(".png")]

d = defaultdict(list)
for file in arr:
    key = file[6]
    d[key].append(file)

print(d)

Переменная d теперь будет содержать все имена файлов в списках, где каждый список характеризуется ключом. Этот ключ является седьмым персонажем. Теперь, если вам нужны все файлы типа (например) K, вы можете извлечь их из d, используя d['K'].

0 голосов
/ 02 марта 2020

Спасибо всем за ответы, я решаю свою проблему следующим образом:

import cv2
import glob
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D
from keras.layers import Activation,Dropout,Flatten,Dense
import numpy
import os

seed = 10
numpy.random.seed(seed)
image_b = [cv2.imread(file_b)for file_b in glob.glob ("C:/BC/BENI/*.png")]
labels = [name[name.find("_") + 1 : name.find("-")] 
for name in glob.glob ("C:/BC/BENI/*.png")]
labeled_images = list(zip(image_b, labels))
all_image =('image_b')
X = all_image[:] 
Y = all_image[:]  
0 голосов
/ 26 февраля 2020

Пожалуйста, рассмотрите возможность использования словаря

    import cv2
    import glob

    same_characters = 6 #number of characters that define if two images are in the same group / type
    image_dict = {img : [cv2.imread(img)] for img in glob.glob("c:/B/*.png")}



    for key in image_dict:
        group = key.split('_')[2][0]
        image_dict[key].append(group)

    for key in image_dict:
        print("Image name = \"",key,"\" => ",image_dict[key][0], ", group =\"" + image_dict[key][1] + "\"")

        cv2.imshow(key, image_dict[key]) #show the image, don't use it when you're reading too many pictures
        cv2.waitKey(0)
        cv2.destroyAllWindows()

Ключами словаря будет имя изображения. Для каждого ключа есть список, где image_dict [name_of_image] [0] - само изображение, image_dict [name_of_image] [1] - группа

Редактировать

Если вы интересуетесь кластеризацией по этим буквам, как вы недавно отметили, вы можете использовать строковую функцию "split", чтобы отделить строку символом. (приведенный выше код изменяется в соответствии с этой новой спецификацией) Пример кода для функции разделения:

    string = "sa_01_DF002"
    group = string.split('_')[2][0] # this is the letter you're interested in
    print("[0] =",string.split('_')[0])
    print("[1] =",string.split('_')[1])
    print("[2] =",string.split('_')[2])

вы можете использовать показ изображений, но вы, вероятно, не хотите использовать его, когда читаете слишком много картинки, так что будьте осторожны

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