Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python3和opencv从遮罩图像获取中心遮罩_Python_Image_Opencv_Image Processing_Computer Vision - Fatal编程技术网

使用Python3和opencv从遮罩图像获取中心遮罩

使用Python3和opencv从遮罩图像获取中心遮罩,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,假设我有以下几组图像: 我想取中心坐标蒙版,即圆形蒙版,其中包含单元格: 最终分离细胞 如何使用Python3和opencv实现这些功能? 检测物体的轮廓 循环浏览轮廓,找到包围图像中心的轮廓 使用该轮廓,为图像创建遮罩并遮罩图像 代码 输出 解释 导入必要的库: 定义一个函数,将图像处理为二值图像,以便在检测图像轮廓时获得最佳结果: 定义一个将循环通过图像轮廓的函数(使用之前定义的处理函数来处理图像),对于轮廓面积大于100(过滤噪声)的每个轮廓,检查图像中心是否在轮廓内(通过检

假设我有以下几组图像:

我想取中心坐标蒙版,即圆形蒙版,其中包含单元格:

最终分离细胞

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

  • 检测物体的轮廓

  • 循环浏览轮廓,找到包围图像中心的轮廓

  • 使用该轮廓,为图像创建遮罩并遮罩图像

  • 代码 输出

    解释
  • 导入必要的库:
  • 定义一个函数,将图像处理为二值图像,以便在检测图像轮廓时获得最佳结果:
  • 定义一个将循环通过图像轮廓的函数(使用之前定义的
    处理
    函数来处理图像),对于轮廓面积大于
    100
    (过滤噪声)的每个轮廓,检查图像中心是否在轮廓内(通过检查调用
    cv2.pointPolyContest
    的结果是否返回一个正数来完成),创建遮罩,遮罩图像并返回遮罩图像:
  • 最后,读入图像,应用
    get_masked
    函数define before并显示图像:

  • 该单元格看起来与其他蒙版对象真的不同。您是否可以控制如何获得该蒙版,或者在其他人进行处理后才获得蒙版图像?如果您可以控制,是否可以更改创建蒙版的方法?您可以共享用于获取蒙版的代码吗?@IanChu检查此项这里的代码我只需要提取包含中心单元格的图像。我可以更改代码,你有什么建议吗?你使用大津的方法制作遮罩。这是因为你不相信颜色是一致的吗?如果你仍然想要一种自动创建遮罩的方法,并且你认为总会有混合对于目标单元格和褪色单元格,您可以运行两次otsu's,它应该会得到目标单元格(加上右侧的红色部分)。我的午休时间即将结束,因此这里有一个链接,指向如何执行此操作的答案:。好的,很酷,让我看看
    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
    
    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)