【发布时间】:2021-06-05 06:37:37
【问题描述】:
这是之前发布的关于从 .png 图像中删除黑色背景的问题 (Remove Background from Image - Python) 的后续内容。我在 Q&A 中使用的脚本运行良好,但在完全去除黑色背景的同时保留图像轮廓内的所有内容时,我仍然会遇到一些细微的不一致。我使用 OpenCV 抓取算法尝试了一个不同的脚本,但我仍然遇到同样的问题。我希望能够在不删除图像轮廓内的像素的情况下从图像中删除黑色背景,这是我在运行脚本时使用的脚本以及示例输入/输出图像。
import numpy as np
import cv2
img = cv2.imread("C:\\users\\mdl518\\Desktop\\overhead_image.png") # Input 8-bit 3-channel image
mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2] = first, second values of img.shape
bgdModel = np.zeros((1,65), np.float64) # temporary array for background
fgdModel = np.zeros((1,65), np.float64) # temporary array for foreground
rect = (1,0,img.shape[1],img.shape[0]) # specify w,h beyond bounds of img.shape
# Grabcut algorithm to extract foreground (5 iterations) within region of interest
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
# Split RGB channels and create new alpha channel
r_channel, g_channel, b_channel = cv2.split(img)
a_channel = np.where((mask==2)|(mask==0), 0, 255).astype('uint8')
img_RGBA = cv2.merge((r_channel, g_channel, b_channel, a_channel)) # add alpha channel to image
cv2.imwrite(".//output_image.png", img_RGBA) ## write new image to file
输入图像:
输出图像(使用上面的脚本): 输出图像(使用“轮廓”方法):
我正在尝试在 0 到 255 之间调整我的“矩形”边界和蒙版设置,但我仍然无法解决这个问题 - 当前设置似乎在不移除额外像素的情况下最大限度地保留了图像,但它仍然没有保留整个图像。非常感谢任何帮助!
【问题讨论】:
-
上次编辑的一些东西破坏了输入图像,你能解决这个问题吗?我通过下载您提供的输入图像并在其上运行得到了我的结果。我用于轮廓的蒙版期望背景完全是黑色。这种块状看起来像是来自某种压缩或抗锯齿,导致图像周围的像素不完全是黑色。尝试下载您的输入图像并在其上运行,看看您是否得到不同的结果。
-
感谢您解决输入图像问题,我已修复它,现在可以再次查看。关于建议的解决方案,我在两台不同的机器上使用原始输入图像重新运行了您的代码,并在两个输出图像中获得了相同的块状。我将研究抗锯齿的可能性,否则尝试调整您的代码以使其正常工作,再次感谢!
-
您是否尝试下载输入图像并运行它?我的意思是,即使你有原始图像,也可以从堆栈溢出中下载它并通过代码运行它。这应该使它与我在计算机上使用的图像完全相同。这将帮助我们了解这是压缩问题还是发生了其他奇怪的事情。
-
Ian - 我认为你在做某事。我重新下载了提供的输入图像并在您的脚本中重新运行,它可以无缝运行! :) 值得一提的是,提供的输入图像是 3D 模型的原始 2D 图像预览 (~3MB) 的屏幕截图 (~750KB)。也许将 3D 模型处理为显示为 2D 图像预览是无法保留轮廓的原因?
标签: python algorithm image opencv image-processing