python - 使用 Python3 和 opencv 从掩码图像中获取中心掩码
解决方案
这个概念
检测物体的轮廓。
遍历轮廓并找到包围图像中心的轮廓。
使用该轮廓,为图像创建一个蒙版并蒙版该图像。
编码
import cv2
import numpy as np
def process(img):
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_canny = cv2.Canny(img_gray, 0, 50)
img_dilate = cv2.dilate(img_canny, None, iterations=1)
img_erode = cv2.erode(img_dilate, None, iterations=1)
return img_erode
def get_masked(img):
h, w, _ = img.shape
center = h // 2, w // 2
contours, _ = cv2.findContours(process(img), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
if cv2.contourArea(cnt) > 100:
if cv2.pointPolygonTest(cnt, center, False) > 0:
mask = np.zeros((h, w), 'uint8')
cv2.drawContours(mask, [cnt], -1, 255, -1)
return cv2.bitwise_and(img, img, mask=mask)
img = cv2.imread("blobs.png")
cv2.imshow("img_processed", get_masked(img))
cv2.waitKey(0)
输出
说明
- 导入必要的库:
import cv2
import numpy as np
- 定义一个函数将图像处理成二值图像,以便在检测图像轮廓时获得最佳结果:
def process(img):
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_canny = cv2.Canny(img_gray, 0, 50)
img_dilate = cv2.dilate(img_canny, None, iterations=1)
img_erode = cv2.erode(img_dilate, None, iterations=1)
return img_erode
- 定义一个循环遍历图像轮廓的函数(使用
process
之前定义的函数来处理图像),并且对于轮廓面积大于的每个轮廓100
(以滤除噪声),检查图像的中心是否在轮廓(通过检查调用结果是否cv2.pointPolygonTest
返回正数来完成),创建蒙版,蒙版图像并返回蒙版图像:
def get_masked(img):
h, w, _ = img.shape
center = h // 2, w // 2
contours, _ = cv2.findContours(process(img), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
if cv2.contourArea(cnt) > 100:
if cv2.pointPolygonTest(cnt, center, False) > 0:
mask = np.zeros((h, w), 'uint8')
cv2.drawContours(mask, [cnt], -1, 255, -1)
return cv2.bitwise_and(img, img, mask=mask)
- 最后,读入你的图像,应用
get_masked
之前定义的函数并显示图像:
img = cv2.imread("blobs.png")
cv2.imshow("img_processed", get_masked(img))
cv2.waitKey(0)
推荐阅读
- javascript - 我在我的不和谐机器人上收到“SyntaxError: Unexpected end of input”
- android - 将什么传递给 Android 的 NDK 以便可以使用 OpenCV 加载图像?
- filter - 使用同一维度中的两个单独过滤值进行测量,由视觉对象中的一个过滤器切片
- mongodb - Mongodb collection.Find() 返回过滤后的数据
- cocoa - 分组 NSOutlineView:总是扩展顶级组?
- node.js - 我目前情况下的 Mongodb 或 SQLite
- node.js - 如何使用 Mongoose 将新对象添加到 MongoDB 中特定对象的数组中?
- c# - 使用联接时,Linq 查询不适用于 .Net Core
- ios - 在 UIButton 上添加的图像视图和标签阻止我点击 - Swift - 以编程方式
- javascript - FabricJS loadfromJSON 不会渲染所有对象