5

I was using PIL library to open an image and then convert it into array later on for DL operations. However I found out that image opened was blurry as opposed to the original image. Why is the image coming out the way it is? and what can be done to fix it? If a possible solution is present in OpenCV that'd be welcome as well.

I tried to use OpenCV as well but I was getting an Assertion Error i.e

error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/resize.cpp:4044: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

Code:

from PIL import Image
import numpy as np
import pandas as pd
import os
import cv2
import keras
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,Dense,Flatten,Dropout
import matplotlib.pyplot as plt

image=Image.open("../content/cell_images/Parasitized/"+i)
size_image = image.resize((50, 50))
print("image")
plot(image,count)
print("resize image")
plot(size_image,count)

Here is the code for plotting:

def plot(img, count):
    w=10
    h=10
    fig=plt.figure(figsize=(8, 8))
    img = np.random.randint(10, size=(h,w))
    fig.add_subplot(rows, columns, count)
    plt.imshow(img)
    plt.show()

enter image description here enter image description here

n1k31t4
  • 14,663
  • 2
  • 28
  • 49
anon012358
  • 51
  • 1
  • 3

2 Answers2

2

Some parts of the code are missing that might contain clues (e.g. you plot method would only plot random noise, as it stands). What might be happening is that you are showing the image in matplotlib in a figure that is much smaller than the image, so matplotlib will automatically scale the image to the pixel space.

The plt.imshow() method can take an argument interpolation, which can produce dramatically different effects. Here are them all compared side-by-side:

interpolation methods

Have a look at the relevant documentation


I personally stick to using OpenCV and cv2.imread() to load images. You just have to be aware (in the context of using Tensorflow/Keras) that the channel are the first dimension. i.e. (Channels, Height, Width) - whereas e.g. plt.imread() will return (Height, Width, Channels).

n1k31t4
  • 14,663
  • 2
  • 28
  • 49
0

Try specifying the resampling filter. Default filter (Nearest Neighbor) is fast but results are not as good.

image=Image.open("../content/cell_images/Parasitized/"+i)
size_image = image.resize((50, 50),PIL.Image.LANCZOS)

Documentation links: [1], [2]

Glorfindel
  • 289
  • 1
  • 6
  • 13
Shamit Verma
  • 2,239
  • 1
  • 8
  • 14
  • 1
    Still, Nearest Neighbor does not wield blurred image. It is actually causes a aliasing-like effect which can be solved by blurring – Pedro Henrique Monforte Apr 04 '19 at 11:56
  • Actually I was looking into various kernels for this dataset, and what they did was read it using cv2.imread and then converting it back into image format using image.from_array. I plotted that as well and still same results. – anon012358 Apr 05 '19 at 06:11
  • For plotting, you are converting it to 10, 10 thumbnail. Is that intentional ? – Shamit Verma Apr 05 '19 at 07:12