【问题标题】:To get the center mask from an image of masks using Python3 and opencv使用 Python 和 opencv 从蒙版图像中获取中心蒙版
【发布时间】:2021-05-09 20:43:53
【问题描述】:

假设我有这些图像集:

我想取中心坐标掩码,即有单元格的圆形:

最终隔离细胞

如何使用 Python3 和 opencv 实现这些?

【问题讨论】:

  • 该单元格看起来与其他蒙面对象确实不同。您是否可以控制如何获得该蒙版,或者您是否只是在其他人进行处理后才获得蒙版图像?如果您确实有控制权,您是否可以更改创建蒙版的方法?你能分享一下你用来获取面具的代码吗?
  • @IanChu 在此处检查此代码colab.research.google.com/drive/…
  • 我只需要提取包含中心单元格的图像。我可以更改代码,您有什么建议吗?
  • 你正在使用大津的方法制作面具。这是因为您不相信颜色是一致的吗?如果您仍然想要创建蒙版的自动化方法,并且您认为目标单元格和褪色单元格总是混合在一起,您可以运行 otsu 两次,它应该得到目标单元格(加上那个斑点红色位正确的)。我的午休时间即将结束,所以这里有一个答案链接,显示如何在此处执行此操作:stackoverflow.com/questions/66234503/…
  • 好吧,让我看看

标签: python image opencv image-processing computer-vision


【解决方案1】:

概念

  1. 检测物体的轮廓。

  2. 遍历轮廓并找到包围图像中心的轮廓。

  3. 使用该轮廓,为图像创建蒙版并蒙版。

代码

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)

输出

解释

  1. 导入必要的库:
import cv2
import numpy as np
  1. 定义一个函数将图像处理成二值图像,以便在检测图像轮廓时获得最佳结果:
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
  1. 定义一个循环遍历图像轮廓的函数(使用之前定义的process函数来处理图像),并且对于轮廓面积大于100的每个轮廓 em>(滤除噪声),检查图像的中心是否在轮廓内(通过检查调用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)
  1. 最后,读入你的图片,应用之前定义的get_masked函数并显示图片:
img = cv2.imread("blobs.png")
cv2.imshow("img_processed", get_masked(img))
cv2.waitKey(0)

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多