Search code examples
pythonspyderimage-preprocessing

I faced some problems to enhance on multiple images using Python, It shows some error


Here, I want to change the default sharpness of the image dataset. It works fine for a single image, but when I apply on multiple images, it shows me an error like AttributeError: 'numpy.ndarray' object has no attribute 'filter'. What should I do to fix this? To that end, my code is given below-

from PIL import Image
from PIL import ImageEnhance
import cv2
import glob

dataset = glob.glob('input/*.png')
other_dir = 'output/'
for img_id, img_path in enumerate(dataset):
    img = cv2.imread(img_path,0)

    enhancer = ImageEnhance.Sharpness(img)
    enhanced_im = enhancer.enhance(8.0)

    cl2 = cv2.resize(enhanced_im, (1024,1024), interpolation = cv2.INTER_CUBIC)
    cv2.imwrite(f'{other_dir}/enhanced_{img_id}.png',cl2)

Solution

  • You're trying to use PIL to enhance a numpy array. cv2 converts images from image paths into numpy arrays. This doesn't work with PIL image operations.

    You can load the image using PIL, do the PIL enhancements then convert it to a numpy array to pass into your cv2.resize() method.

    Try:

    from PIL import Image
    from PIL import ImageEnhance
    import cv2
    import glob
    import numpy as np
    
    dataset = glob.glob('input/*.png')
    other_dir = 'output/'
    for img_id, img_path in enumerate(dataset):
        img = Image.open(img_path)  # this is a PIL image
    
        enhancer = ImageEnhance.Sharpness(img)  # PIL wants its own image format here
        enhanced_im = enhancer.enhance(8.0)  # and here
        enhanced_cv_im = np.array(enhanced_im) # cv2 wants a numpy array
    
        cl2 = cv2.resize(enhanced_cv_im, (1024,1024), interpolation = cv2.INTER_CUBIC)
        cv2.imwrite(f'{other_dir}/enhanced_{img_id}.png',cl2)