Skip to content
Advertisement

plt.imshow() display the image inside another image

I am new to Python and I apologize if this is very basic. I am doing image processing but when I read a png image using cv2 and then display the image using plt.imshow() it gives me strange images(Image with extra boundries). I did the following.

import cv2
import numpy as np

img1 = cv2.imread('img.png',cv2.IMREAD_GRAYSCALE)
plt.figure(figsize=(10,4))
plt.imshow(img1, 'gray')
plt.title("ORIGINAL")
plt.savefig("original.png")

  
kernel = np.ones((4,4),np.uint8)
opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)
plt.figure(figsize=(10,4))
plt.imshow(opening, 'gray')
plt.title("OPENING OF ORIGINAL")
plt.savefig("opening of original.png")

I am attaching the resulting images here.

[the original image]

1

[After displaying the image through plt.imshow().]

2

[after doing opening image processing technique]

3

Advertisement

Answer

Is the extra part you’re talking about a red area?enter image description here

If I understand correctly, This code can be used to cut the transparent part of the picture

import cv2
import numpy as np
import matplotlib.pyplot as plt

def cv2_crop(im, box):
    return im.copy()[box[1]:box[3], box[0]:box[2], :]

def get_transparency_location(image):
    height, width, channel = image.shape  
    assert channel == 4  
    first_location = None  
    last_location = None  
    first_transparency = []  
    last_transparency = []  
    for y, rows in enumerate(image):
        for x, BGRA in enumerate(rows):
            alpha = BGRA[3]
            if alpha != 0:
                if not first_location or first_location[1] != y:  
                    first_location = (x, y)  
                    first_transparency.append(first_location)
                last_location = (x, y)  
        if last_location:
            last_transparency.append(last_location)

    top = first_transparency[0]
    bottom = first_transparency[-1]
    left = None
    right = None
    for first, last in zip(first_transparency, last_transparency):
        if not left:
            left = first
        if not right:
            right = last
        if first[0] < left[0]:
            left = first
        if last[0] > right[0]:
            right = last

    upper_left = (left[0], top[1])  
    bottom_right = (right[0], bottom[1])  
    box =upper_left[0], upper_left[1], bottom_right[0], bottom_right[1]
    result = cv2_crop(image, box)
    #cv2.imwrite('result.png', result)
    return result
    


if __name__ == '__main__':
    #img1 = cv2.imread('img.png',cv2.IMREAD_GRAYSCALE)
    image = cv2.imread('img.png', cv2.IMREAD_UNCHANGED)  
    img1 = get_transparency_location(image)

    plt.figure(figsize=(10,4))
    plt.imshow(img1, 'gray')
    plt.title("ORIGINAL")
    plt.savefig("original.png")


    kernel = np.ones((4,4),np.uint8)
    opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)
    plt.figure(figsize=(10,4))
    plt.imshow(opening, 'gray')
    plt.title("OPENING OF ORIGINAL")
    plt.savefig("opening of original.png")

newpic1 newpic2

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement