Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove bounding box outline

I have this image

enter image description here

When I apply

from skimage import filters
result_sobel = filters.sobel(image)

The image is

enter image description here

How can I remove the bounding box outline so it blends with the background?

Ideally, the output will be the black background, and the red in between without the outlined bounding box.

like image 713
PolarBear10 Avatar asked Nov 01 '25 07:11

PolarBear10


2 Answers

Here is one way in Python/OpenCV. Just get the contours from the original gray image. Then draw those in black over your red outline image as 3 pixels thick (Sobel edge thickness). I note that your two images are not the same size and the outlines are shifted relative to the gray boxes. Why is that?

Gray Original:

enter image description here

Sobel Red Edges:

enter image description here

import cv2
import numpy as np

# read original image as grayscale 
img = cv2.imread('gray_rectangle.png', cv2.IMREAD_GRAYSCALE)
hi, wi = img.shape[:2]

# read edge image
edges = cv2.imread('red_edges.png')

# edges image is larger than original and shifted, so crop it to same size
edges2 = edges[3:hi+3, 3:wi+3]

# threshold img
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)[1]

# get contours and draw them as black on edges image
result = edges2.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
cv2.drawContours(result, contours, -1, (0,0,0), 3)

# write result to disk
cv2.imwrite("red_edges_removed.png", result)

# display it
cv2.imshow("ORIG", img)
cv2.imshow("EDGES", edges)
cv2.imshow("THRESH", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)


Result:

enter image description here

like image 89
fmw42 Avatar answered Nov 03 '25 21:11

fmw42


You can use a mask in skimage.filters.sobel:

import skimage

img = skimage.io.imread('N35nj.png', as_gray=True)   
mask = img > skimage.filters.threshold_otsu(img)
edges = skimage.filters.sobel(img, mask=mask)

Let's plot the result:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,5))
ax[0].imshow(img, cmap='gray')
ax[0].set_title('Original image')

ax[1].imshow(edges, cmap='magma')
ax[1].set_title('Sobel edges')

for a in ax.ravel():
    a.axis('off')

plt.tight_layout()
plt.show()

enter image description here

like image 24
Andreas K. Avatar answered Nov 03 '25 22:11

Andreas K.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!