1

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)
Jacob
  • 27
  • 1
  • 7

1 Answers1

1

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)
Ollie in PGH
  • 2,559
  • 2
  • 16
  • 19