我有这张图片
我申请时
from skimage import filters
result_sobel = filters.sobel(image)
图片是
如何删除边界框轮廓,使其与背景融合?
理想情况下,输出将为黑色背景,中间为红色,而没有边框。
答案 0 :(得分:3)
您可以在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)
让我们绘制结果:
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()
答案 1 :(得分:2)
这是Python / OpenCV中的一种方法。只需从原始灰色图像中获取轮廓即可。然后在红色轮廓图像上以3像素厚(Sobel边缘厚度)的黑色绘制那些。我注意到您的两个图像的大小不同,并且轮廓相对于灰色框有所偏移。为什么呢?
灰色原图:
Sobel Red Edges:
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)
结果: