Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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
在python中将图像分成两部分_Python_Opencv_Image Processing_Computer Vision_Image Segmentation - Fatal编程技术网

在python中将图像分成两部分

在python中将图像分成两部分,python,opencv,image-processing,computer-vision,image-segmentation,Python,Opencv,Image Processing,Computer Vision,Image Segmentation,我有一张这样的照片 如图所示,图像主要由两部分组成。 上上下下 我想把它们分开 在第一次尝试中,我使用K-meas算法实现。 [2]中的kmeans=kmeans(n_集群=2,随机状态=0)。。。 np.asarray(np.where(finalImage==255)).T) 在Image1案例中,上部和下部的圆点数量几乎相同。但在图2中不起作用 之后,我使用cv2.findContours获得最大面积2等高线 im, contours, hierarchy = cv2.findCon

我有一张这样的照片

如图所示,图像主要由两部分组成。 上上下下

我想把它们分开

在第一次尝试中,我使用K-meas算法实现。

[2]中的
kmeans=kmeans(n_集群=2,随机状态=0)。。。
np.asarray(np.where(finalImage==255)).T)

在Image1案例中,上部和下部的圆点数量几乎相同。但在图2中不起作用

之后,我使用cv2.findContours获得最大面积2等高线

im, contours, hierarchy = cv2.findContours(Img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    # get first contour
    maxContour = 0
    for contour in contours:
        contourSize = cv2.contourArea(contour)
        if contourSize > maxContour:
            maxContour = contourSize
            maxContourData0 = contour

    # get second contour
    if contours.__len__() != 1:
        maxContour = 0
        for contour in contours:
            contourSize = cv2.contourArea(contour)
            if contourSize > maxContour and np.sum(np.subtract(contour[0:5],maxContourData0[0:5])) != 0:
                maxContour = contourSize
                maxContourData1 = contour

    mask = np.zeros_like(Img)
    cv2.fillPoly(mask, [maxContourData0], 1)
    if contours.__len__() != 1:
        cv2.fillPoly(mask, [maxContourData1], 1)

    finalImage = np.zeros_like(Img)
    finalImage[:, :] = np.multiply(Img, mask)

    cv2.imshow('final', finalImage)
    cv2.waitKey(0)
但它有时是一个轮廓而不是两个


是否有强制获取两个blob的情况?

您可以尝试使用,但请注意,您应该将
connectivity=4
而不是
8
设置为默认值。

如果您不介意运行时间,您可以尝试光谱聚类

K-means不能解决这个问题,因为它隐式地假设簇是球形的,而谱簇更关心连通性。坏消息是它比K-means慢得多

下面是我的实现使用:

输出:

19.5850000381

如果水滴的实际大小不重要,而只是相对大小,则可以在提取水滴之前尝试应用侵蚀,这可能有助于消除两个斑点之间的连接。连接的含义是什么?@JungseokCho Connectivity定义了基础网格图的构造方式:8-connect表示每个像素都连接到其所有8个邻居,而4-connect表示一个像素只连接到上面的四个像素,请注意,您的示例中的两段是“对角”接触的:也就是说,它们被认为是通过8-connect连接的,但考虑到4是分开的-connect@JungseokCho光谱聚类在不同尺度的聚类中有一个已被证实的问题。你应该在例子中仔细使用它。
19.5850000381