Как сделать K-означает кластеризацию для нескольких изображений в определенном каталоге и сохранить его в другом каталоге? (на местном) - PullRequest
0 голосов
/ 31 октября 2018
import numpy as np
import cv2

img = cv2.imread('home.jpg')
Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))

cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Выше приведен простой простой код кластеризации K-Means, который хорошо работает для «одного» изображения. Однако мне нужен код для нескольких изображений в каталоге.

Итак, я создал код, но он не работает с ошибкой: объект 'PngImageFile' не имеет атрибута 'reshape' (решенная проблема)

Но после этого у меня возникла проблема с ошибкой: объект 'numpy.ndarray' не имеет атрибута 'save'. Я думаю, это потому, что я изменил код с

img = Image.open(fullpath)
#to
img = np.array(Image.open(fullpath))

Ниже приведен код, над которым я работаю.

path = "Desktop/Gray/fmtial_gb/good_crop/"
sub_path = "Desktop/Gray/fmtial_gb/good_crop_result/"
dirs = os.listdir(path)
def kmean():
    from os import listdir,makedirs
    from os.path import isfile,join
    import matplotlib.pylab as plt
    import matplotlib.image as mpimg
    import cv2
    import numpy as np
    from PIL import Image
    import os.path, sys
    for item in dirs:
        fullpath = os.path.join(path,item)
        pathos = os.path.join(sub_path,item)
        if os.path.isfile(fullpath):
            #img = Image.open(fullpath)
            img = np.array(Image.open(fullpath))
            f, e = os.path.splitext(pathos)
            #img = cv2.imread('Desktop/Gray/fmtial_gb/good_crop/RD091090(80)Cropped.bmp')
            Z = img.reshape((-1,3))

            # convert to np.float32
            Z = np.float32(Z)

            # define criteria, number of clusters(K) and apply kmeans()
            criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
            K = 2
            ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

            # Now convert back into uint8, and make original image
            center = np.uint8(center)
            res = center[label.flatten()]
            res2 = res.reshape((img.shape))

            #cv2.imshow('res2',res2)
            #cv2.waitKey(0)
            #cv2.destroyAllWindows()

            Image.fromarray(res2).save(f + 'kmeans.png', "png", quality=100)     
kmean()   

1 Ответ

0 голосов
/ 31 октября 2018

Я полагаю, это потому, что вы пытаетесь изменить объект изображения PIL вместо массива numpy.

Попробуйте изменить img = Image.open(fullpath) на img = np.array(Image.open(fullpath)), и оно должно работать.

...