0

I use following function to display different images with its actual size in matplotlib subplot. I go this function from this reference: https://stackoverflow.com/a/53816322/22241489

def display_image(im_path):

    dpi = 80
    im_data = plt.imread(im_path)
    height, width, depth = im_data.shape

    # What size does the figure need to be in inches to fit the image?
    figsize = width / float(dpi), height / float(dpi)

    # Create a figure of the right size with one axes that takes up the full figure
    fig = plt.figure(figsize=figsize)
    ax = fig.add_axes([0, 0, 1, 1])

    # Hide spines, ticks, etc.
    ax.axis('off')

    # Display the image.
    ax.imshow(im_data, cmap='gray')

    plt.show()

But the problem is when I convert image to grayscale using opencv as follows

base_image = cv.imread(image)

gray = cv.cvtColor(base_image, cv.COLOR_BGR2GRAY)

cv.imwrite('temp/gray.jpg', gray)

then I can't use above function cause I got an error like this

ValueError                                Traceback (most recent call last)
Cell In[17], line 1
----> 1 display_image('temp/gray.jpg')

Cell In[10], line 5, in display_image(im_path)
      3 dpi = 80
      4 im_data = plt.imread(im_path)
----> 5 height, width, depth = im_data.shape
      7 # What size does the figure need to be in inches to fit the image?
      8 figsize = width / float(dpi), height / float(dpi)

ValueError: not enough values to unpack (expected 3, got 2)

How I fix this issue?

1 Answer 1

1

When you convert to grayscale, the color dimension in the array no longer exists. In a color image, the dimension of the array are height x width x 3 (for a standard 3 color channel image). However, when in grayscale, we no longer have the 3 color, so the last dimension is flattened resulting in an image array of height x width.

Since you aren't using the depth, you can collect it using tuple packing, which adds it to a list if it is there, and ignores it if it is not.

def display_image(im_path):

    dpi = 80
    im_data = plt.imread(im_path)
    height, width, *depth = im_data.shape

    # What size does the figure need to be in inches to fit the image?
    figsize = width / float(dpi), height / float(dpi)

    # Create a figure of the right size with one axes that takes up the full figure
    fig = plt.figure(figsize=figsize)
    ax = fig.add_axes([0, 0, 1, 1])

    # Hide spines, ticks, etc.
    ax.axis('off')

    # Display the image.
    ax.imshow(im_data, cmap='gray')

    plt.show()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.