[VP] Kmeans聚类分割简单图像,光流算法显示移动方向 Optical Flow


有如下图像:im1, im2, im3是两个物体每一步移动的图像,im4是移动的总体图

在这里插入图片描述

Kmeans聚类分割简单图形代码

import numpy as np
from scipy.ndimage import rotate
import os
from PIL import Image
import math
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

im1 = np.array(im1)
im2 = np.array(im2)
im3 = np.array(im3)

def segmantImage(im):
    im = np.mat(im)
    row, col = im.shape
    
    label = KMeans(n_clusters=2).fit_predict(im.reshape(row*col, 1))
    
    label = label.reshape([row,col])

    segImage = Image.new("L", (row, col))

    for i in range(row):                          
        for j in range(col):
            segImage.putpixel((i,j), int(256/(label[i][j]+1)))
            
    
    return np.array(segImage.rotate(270).transpose(Image.FLIP_LEFT_RIGHT))

plt.imshow(segmantImage(im1))
plt.title('Segment square and triangle objects')

图像中的对象在一个局部区域上将具有相似的值,我们可以对这些不同的局部像素值进行分类。和图1一样,正方形区域和三角形区域有相同的像素值,所以选择k-means将这些像素聚为两个类。结果是正方形区域和三角形区域的像素标记为1,其他像素标记为0。这样就能分割出图像了

在这里插入图片描述

使用k-means的优点是很容易用来分割样本图像。缺点是,很难为复杂的图像设置一个合适的k,而且每次迭代都需要重新计算整个数据。

光流算法

顺便还标出了移动的方向,非常好用!

def opticalFlow(im1, im2):
    # params for ShiTomasi corner detection
    feature_params = dict( maxCorners = 100,
                           qualityLevel = 0.3,
                           minDistance = 7,
                           blockSize = 7 )
    # Parameters for lucas kanade optical flow
    lk_params = dict( winSize  = (15,15),
                      maxLevel = 2,
                      criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

    p0 = cv2.goodFeaturesToTrack(im1, mask = None, **feature_params)
    mask = np.zeros_like(im1)
    color = np.random.randint(0,255,(100,3))
    p1, st, err = cv2.calcOpticalFlowPyrLK(im1, im2, p0, None, **lk_params)

    # Select good points
    if p1 is not None:
        good_new = p1[st==1]
        good_old = p0[st==1]

    # draw the tracks
    for i,(new,old) in enumerate(zip(good_new, good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv2.line(mask, (int(a),int(b)),(int(c),int(d)), color[i].tolist(), 2)
        frame = cv2.circle(im2,(int(a),int(b)),5,color[i].tolist(),-1)

    img = cv2.add(frame,mask)
    return img


of1 = opticalFlow(im1, im2)
of2 = opticalFlow(im2, im3)

_, ax = plt.subplots(1, 3, figsize = (15, 10))

ax[0].imshow(of1)
ax[0].set_title('Optical Flow From Image 1 to 2')
ax[0].axis('off')

ax[1].imshow(of2)
ax[1].set_title('Optical Flow From Image 2 to 3')
ax[1].axis('off')

ax[2].imshow(im4)
ax[2].set_title('Image 4')
ax[2].axis('off')

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Matlab的Image Processing Toolbox中的kmeans函数进行图像聚类分割,具体步骤如下: 1. 读取图像 2. 将图像转换为灰度图像 3. 将灰度图像矩阵转换为向量 4. 调用kmeans函数,设置聚类数和迭代次数等参数 5. 将聚类结果矩阵重塑为图像矩阵 6. 显示聚类结果图像并进行调整和优化 使用kmeans聚类算法进行图像分割,可以对图像进行快速准确的分割,使得图像处理更加高效、精确、可靠。 ### 回答2: k-means clustering是数字图像处理中使用的一种常见算法,该算法能够对图像进行聚类分割和分析。在matlab数字图像处理实验中,k-means clustering可以用来将彩色图像分割成若干个类别,每个类别代表着图像中的一种颜色或一种纹理。在这个过程中,k-means clustering会使用聚类中心来表示每个类别,聚类中心是类别的中心点,能够反映类别的特征。在分割结束后,我们可以将每个像素点所在的类别赋予它一个颜色,从而得到了一幅分割后的图像。 在对图像进行k-means clustering分割时,我们首先需要将图像转化为向量形式,即将图像中的每个像素都表示成一个向量,并将这些向量组成一个矩阵。然后,我们通过对向量之间的距离度量来计算聚类中心,即通过将向量分成k个类别并计算每个类别的中心点来确定聚类中心。接着,我们使用聚类中心来进行分割,将图像中的每个像素都与聚类中心进行比较并将其分配到最接近的类别中。分割结束后,我们还可以使用一些可视化的方法来显示分割后的图像,例如各个类别的中心点、每个像素所属的类别等。 k-means clustering 在图像分割中具有很大的优势,它不仅可以对图像进行颜色分割,还能够对图像中的其他特征进行分割,例如纹理、形状等。此外,该算法简单又有效,能够在较短的时间内完成图像分割聚类。因此,在matlab数字图像处理实验中,k-means clustering是一种非常实用的算法,能够为我们分析和处理图像提供有力的支持。 ### 回答3: K-Means聚类算法图像分割中常用的算法,该算法能够将图像分成数个不同的类别,从而实现对图像分割的目的。Matlab是一个强大的数字图像处理工具,也是一个非常好的实验平台,我们可以使用Matlab来实现K-Means聚类算法图像进行分割。 首先需要准备一张需要分割图像,并将图像转换为灰度图像。然后使用Matlab自带的函数imread()对图像进行读取,使用imresize()函数进行图像大小的调整。接下来,我们可以使用imhist()函数查看图像的灰度直方图,以便对图像的特征有更加全面的了解。 接下来,使用K-Means算法进行图像分割,Matlab自带了一个kmeans()函数,该函数可以很方便的使用K-Means算法图像进行分割。使用kmeans()函数需要给函数传递三个参数,分别是需要分割图像分割的类别数和最大迭代次数。分割的类别数和最大迭代次数需要进行多次实验调整选择,适合的类别数和最大迭代次数能够得到更好的图像分割效果。 最后,我们可以使用Matlab自带的imshow()函数查看图像分割的结果,为了方便比较,我们需要将图像分割前和分割后的图像进行比对。如果图像分割效果不理想,我们可以通过参数调整或改变算法来进行优化,比如可以使用其他聚类算法、改变聚类的特征参数或对图像进行其他处理等。 总之,K-Means聚类算法图像分割中常用的算法之一,使用Matlab作为实验平台可以很方便的进行图像处理和算法实现。了解了算法流程后,我们可以通过多次实验对参数进行调整,以得到比较好的图像分割效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值