Python 将背景颜色扩展到连接的组件(整体填充)-图像处理

Python 将背景颜色扩展到连接的组件(整体填充)-图像处理,python,opencv,scipy,computer-vision,flood-fill,Python,Opencv,Scipy,Computer Vision,Flood Fill,我一直想弄清楚如何将背景颜色向内扩展。 我有这张图像,它是经过噪声背景减法后通过遮罩生成的 我正努力做到这一点: 到目前为止,我已经尝试过这样做,但没有成功: import cv2 from PIL import Image import numpy as np Image.open("example_of_misaligned_frame.png") # open poor frame img_copy = np.asanyarray(img).copy() contours, _ =

我一直想弄清楚如何将背景颜色向内扩展。 我有这张图像,它是经过噪声背景减法后通过遮罩生成的

我正努力做到这一点:

到目前为止,我已经尝试过这样做,但没有成功:

import cv2
from PIL import Image
import numpy as np

Image.open("example_of_misaligned_frame.png") # open poor frame

img_copy = np.asanyarray(img).copy()

contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX) # find contours 

# create bounding box around blob and figure out the row.cols to iterate over
x,y,w,h = cv2.boundingRect(max(contours, key = cv2.contourArea)) 

# flood fill the entire region with back, hoping that off-white region gets filled due to connected components.
for row in range(y, y+h):
    for col in range(x, x+w):
        cv2.floodFill(img_copy, None, seedPoint=(col,row), newVal=0)

这会产生一个完全黑色的图像:

非常感谢为我指明正确方向的任何帮助。

您可以使用洪水填充两次来解决此问题:

第一次-用灰白色填充黑色像素。 第二次-用黑色填充灰白色像素。 查找灰白色的RGB值仍然存在问题。 我找到了一个找到灰白色的临时解决方案,我不知道什么颜色被认为是背景的确切规则

下面是一个工作代码示例:

import cv2
import numpy as np

#Image.open("example_of_misaligned_frame.png") # open poor frame
img = cv2.imread("example_of_misaligned_frame.png")

#img_copy = np.asanyarray(img).copy()
img_copy = img.copy()

#Improvised way to find the Off White color (it's working because the Off White has the maximum color components values).
tmp = cv2.dilate(img, np.ones((50,50), np.uint8), iterations=10)

# Color of Off-White pixel
offwhite = tmp[0, 0, :]

# Convert to tuple
offwhite = tuple((int(offwhite[0]), int(offwhite[1]), int(offwhite[2])))

# Fill black pixels with off-white color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=offwhite)

# Fill off-white pixels with black color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=0, loDiff=(2, 2, 2, 2), upDiff=(2, 2, 2, 2))

cv2.imshow("img_copy", img_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.1扩张的结果:

第一次cv2.1洪水填充的结果:

第二次cv2.2洪水填充的结果:

您可以使用洪水填充两次来解决此问题:

第一次-用灰白色填充黑色像素。 第二次-用黑色填充灰白色像素。 查找灰白色的RGB值仍然存在问题。 我找到了一个找到灰白色的临时解决方案,我不知道什么颜色被认为是背景的确切规则

下面是一个工作代码示例:

import cv2
import numpy as np

#Image.open("example_of_misaligned_frame.png") # open poor frame
img = cv2.imread("example_of_misaligned_frame.png")

#img_copy = np.asanyarray(img).copy()
img_copy = img.copy()

#Improvised way to find the Off White color (it's working because the Off White has the maximum color components values).
tmp = cv2.dilate(img, np.ones((50,50), np.uint8), iterations=10)

# Color of Off-White pixel
offwhite = tmp[0, 0, :]

# Convert to tuple
offwhite = tuple((int(offwhite[0]), int(offwhite[1]), int(offwhite[2])))

# Fill black pixels with off-white color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=offwhite)

# Fill off-white pixels with black color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=0, loDiff=(2, 2, 2, 2), upDiff=(2, 2, 2, 2))

cv2.imshow("img_copy", img_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.1扩张的结果:

第一次cv2.1洪水填充的结果:

第二次cv2.2洪水填充的结果:

在Python/OpenCV中,您可以简单地从充满洪水的进程图像中提取一个二进制掩码,并腐蚀该掩码。然后将其重新应用于输入或泛洪填充结果

输入:

遮罩:

腐蚀面罩:

结果:


根据需要调整圆形椭圆形态学内核的大小,以或多或少地减少腐蚀。

在Python/OpenCV中,您只需从充满洪水的进程图像中提取一个二进制掩码并腐蚀该掩码即可。然后将其重新应用于输入或泛洪填充结果

输入:

遮罩:

腐蚀面罩:

结果:


根据需要调整圆形椭圆形态内核的大小,以减少或减少腐蚀。

从第一张图像到第二张图像的标准是什么?从一个角度看,前景遮罩似乎只是被一个圆形遮罩侵蚀了。请将整体填充的结果保存为二值图像遮罩。在你的面膜上使用形态腐蚀。然后将修改后的遮罩应用于原始图像。@RavitejaNarra标准是通过连接的组件用零填充灰白色区域。侵蚀是我之前一直在做的事情,但大部分时间也侵蚀了感兴趣的项目。从第一张图片到第二张图片的标准是什么?从一个角度看,前景遮罩似乎只是被一个圆形遮罩侵蚀了。请将整体填充的结果保存为二值图像遮罩。在你的面膜上使用形态腐蚀。然后将修改后的遮罩应用于原始图像。@RavitejaNarra标准是通过连接的组件用零填充灰白色区域。侵蚀是我以前一直在做的事情,但大部分时间也侵蚀了我感兴趣的东西完美!。天哪!我被这件事困扰了一段时间。所以,关键是天才!至于即兴创作的灰白色背景色,我也没有确切的值,但不是取第一个值tmp[0,0,:],我可能会取放大后非零像素的平均值。无论如何,非常感谢!完美的天哪!我被这件事困扰了一段时间。所以,关键是天才!至于即兴创作的灰白色背景色,我也没有确切的值,但不是取第一个值tmp[0,0,:],我可能会取放大后非零像素的平均值。无论如何,非常感谢!谢谢你的回复。这确实有效,我以前也这样做过,但在很多情况下,我最终删除了比我想删除的更多感兴趣的项目。谢谢回复。这确实有效,我以前也这样做过,但在很多情况下,我最终删除了比我想删除的更多的感兴趣的项目。