在python中将图像分成两部分
我有一张这样的照片 如图所示,图像主要由两部分组成。 上上下下 我想把它们分开 在第一次尝试中,我使用K-meas算法实现。 [2]中的在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
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