python - 如何使用opencv填充整个内部轮廓
问题描述
在下图中,我试图用名称“jupiter”涂黑内部设计带
我想要的结果如下
我尝试过使用 RETR_EXTERNAL ,然后使用 fillPoly ,但它只会使二进制图像的“白色”部分(波段)变黑,而不是完全按照我的意愿。
我需要如何即兴发挥才能让它完全变黑?
解决方案
您可以使用遮罩技术来完成您的工作。这是我的代码:
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
import copy
%matplotlib inline
#-----------------------------------------------------------------------------------
I = cv2.imread('E:\\Mukul\\others\\stof.png') #input image
#I.shape
I_cnt = np.where(I[:,:,2] == 255) #location of your bounding box region
I_mask = np.zeros_like(I[:,:,2]) # mask for the input image
I_mask[list(I_cnt[0]), list(I_cnt[1])] = 255
plt.imshow(I_mask, cmap = 'gray')
I_cnt1, _ = cv2.findContours(I_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
np.array(I_cnt1).shape # (1, 1420, 1, 2)
cv2.fillConvexPoly(I_mask, I_cnt1[0], 255)
plt.imshow(I_mask,cmap = 'gray')
由于我们希望我们的边界框区域是黑色的,我们将使用反转我们的图像cv2.bitwise_not()
,然后使用它cv2.bitwise_and()
来获得所需的输出图像。
I_mask1 = cv2.bitwise_not(I_mask)
out = cv2.bitwise_and(I_mask1, I[:,:,2])
plt.imshow(out,cmap = 'gray')
I_cnt[0]
我们可以直接将(包含 x 坐标的数组) 和I_cnt[1]
(包含 y 坐标的数组)转换为数组,而不是使用上面的行来查找可用于填充区域的二进制掩码的轮廓(x,y) 坐标使用以下代码:
temp_list = []
for a, b in zip(I_cnt[0], I_cnt[1]):
temp_list.append([a, b])
ctr = np.array(temp_list).reshape((-1,1,2)).astype(np.int32)
I_mask2 = np.zeros_like(I[:,:,2])
I_mask2[list(I_cnt[0]), list(I_cnt[1])] = 255
plt.imshow(I_mask2, cmap = 'gray')
cv2.fillConvexPoly(I_mask1, ctr, 255)
plt.imshow(I_mask2,cmap = 'gray')
推荐阅读
- python - 得到了一个奇怪的 ROC 曲线和分类器的 AUC
- php - 如何在 Laravel 中打印出包含多个产品的所有订单?
- azure-devops - Web部署后通过Azure发布管道复制或重命名Web App下的子文件夹中的文件
- language-design - 如何在 agda 中证明一种简单语言的弱化?
- javascript - TypeError:尝试导航 javascript 对象时无法读取未定义的属性“1”
- ios - 按 TimeStamp 订购多个 TableViewCell 类型
- c++ - 尝试在 C++ 中创建随机数生成器并出现错误
- python - 在 buildozer 创建的 android 应用程序上,我在哪里可以找到 sqlite3 创建的 .db 文件?
- windows - 任务栏颜色的注册表项是什么?
- node.js - Coinex WebSocket 市场深度通道有时不发送消息移除价格水平