如何在Python中用白色填充轮廓外的背景
实现轮廓外区域白色填充
我已经成功提取出产品的轮廓,现在需要把轮廓以外的所有区域用白色填充。以下是我提取轮廓的Python代码,目前已经得到轮廓效果,但不知道如何完成填充操作,期望的输出效果如下。
修改后的完整代码
import cv2 import numpy as np # 加载图像 empty = cv2.imread("empty.jpg") full = cv2.imread("3.jpg") # 保存彩色副本用于可视化 full_c = full.copy() # 转换为灰度图 empty_g = cv2.cvtColor(empty, cv2.COLOR_BGR2GRAY) full_g = cv2.cvtColor(full, cv2.COLOR_BGR2GRAY) # 高斯模糊,抵消轻微相机移动的影响 empty_g = cv2.GaussianBlur(empty_g, (41, 41), 0) full_g = cv2.GaussianBlur(full_g, (41, 41), 0) # 计算有产品和空场景的灰度差 diff = full_g - empty_g cv2.imwrite("diff.jpg", diff) # 反向阈值处理:将亮度高于240的像素设为黑色(对应无产品区域) _, diff_th = cv2.threshold(diff, 240, 245, 1) cv2.imwrite("diff_th.jpg", diff_th) # 结合差异图和阈值结果,提取产品区域 bag = cv2.bitwise_and(diff, diff_th, None) cv2.imwrite("just_the_bag.jpg", bag) # 再次阈值处理得到二值掩码 _, bag = cv2.threshold(bag, 100, 255, 0) # 膨胀操作,弥补前期模糊造成的轮廓收缩 kernel = np.ones((6, 6), np.uint8) bag = cv2.dilate(bag, kernel, iterations=1) # 查找轮廓,按面积排序取前3个 contours, _ = cv2.findContours(bag, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key=cv2.contourArea, reverse=True)[:3] # ------------------- 新增填充逻辑 ------------------- # 创建与原图大小一致的白色背景图像 white_bg = np.full_like(full, (255, 255, 255), dtype=np.uint8) # 创建掩码:仅轮廓内部区域为白色,其余为黑色 mask = np.zeros_like(full_g) cv2.drawContours(mask, [contours[0]], -1, 255, thickness=cv2.FILLED) # 将原图中轮廓内的区域复制到白色背景上 cv2.bitwise_and(full, full, white_bg, mask=mask) # --------------------------------------------------- # 显示并保存填充后的结果 cv2.imshow("filled_result", white_bg) cv2.imwrite("filled_result.jpg", white_bg) # 原轮廓可视化(可选保留) cv2.drawContours(full_c, [contours[0]], -1, (0, 255, 0), 2) cv2.imshow("contour", full_c) cv2.imwrite("result2.jpg", full_c) cv2.waitKey(0) cv2.destroyAllWindows()
关键步骤说明
- 创建白色背景:用
np.full_like生成和原图尺寸、通道数完全一致的白色图像,作为最终输出的基底 - 生成填充掩码:创建全黑的单通道掩码,通过
cv2.drawContours设置thickness=cv2.FILLED,将目标轮廓内部填充为白色,这个掩码用来标记需要保留原图内容的区域 - 合并图像:通过
cv2.bitwise_and操作,利用掩码把原图中轮廓内的区域提取出来,覆盖到白色背景上,最终得到轮廓外全白的效果
当前轮廓效果

期望输出效果

内容的提问来源于stack exchange,提问作者Andie31
相关产品推荐
相关产品推荐

