K表示图像分割fai

2024-04-16 22:30:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在制作一个图像分割程序使用K-均值算法。在

以下是我所做工作的总结:

  • 用lite-spread算法创建N个质心(得到更好的结果 而不是随机的)
  • 将每个像素指定给最近的质心
  • 将质心位置更改为“质心”
  • 重复2和3,直到没有任何变化

为了确定质心,我取分配给质心的所有像素的平均位置。在

我的问题是,当图片非常简单时,它就可以正常工作:

Working picture

但当我使用更复杂的图片时(这张图片根本就不是“真正复杂的”)

Fail picture

我真的不知道为什么这个不能正常工作,我仔细检查了我的代码,在算法上看不出任何错误,而且问题不在算法的选择上,因为很多人在互联网上用K均值来显示具有良好分割效果的图片

如果你知道我怎样才能提高我的成绩。。。在

这是我的代码,如果你想自己测试的话。在

我使用的是python2.7

我的算法py公司名称:

from PIL import Image
from Pixel import Pixel
from Centroid import Centroid
import Tools
import random

class Algo:

    def run(self, inputPath, outputPath, nbCluster, nbIteration):
        size, pixelList = self.getImageData(inputPath)

        centroidArray = self.initCentroid(size, pixelList, nbCluster)

        for iteration in range(0, nbIteration):
            print "Iteration : " + str(iteration)
            self.clearCentroidsMembers(centroidArray)
            self.assignCentroidToPixel(pixelList, centroidArray)
            self.moveCentroid(centroidArray)

        self.printResult(outputPath, size, centroidArray)


    def clearCentroidsMembers(self, centroidArray):
        for centroid in centroidArray:
            centroid.members = []

    def assignCentroidToPixel(self, pixelList, centroidArray):
        for pixel in pixelList:
            minDist = 100000;
            closestCentroid = None
            for centroid in centroidArray:
                dist = Tools.getDistance(pixel.graphCoordinate, centroid.graphCoordinate)
                if dist < minDist:
                    minDist = dist
                    closestCentroid = centroid
            closestCentroid.members.append(pixel)

    def moveCentroid(self, centroidArray):
        for centroid in centroidArray:
            newPos = Tools.getCenterOfMass(centroid.members)
            if newPos == None:
                newPos = centroid.graphCoordinate
            centroid.graphCoordinate = newPos


    def initCentroid(self, size, pixelList, nbCluster):
        centroidArray = []

        randomPixelPos = random.randint(0, len(pixelList) - 1)
        graphCoordinate = pixelList[randomPixelPos].graphCoordinate
        centroid = Centroid(graphCoordinate)
        centroidArray.append(centroid)

        for i in range(1, nbCluster):
            maxDist = 0
            graphCoordinate = None
            for pixel in pixelList:
                dist = 0
                for centroid in centroidArray:
                    dist += Tools.getDistance(pixel.graphCoordinate, centroid.graphCoordinate)
                dist = dist / len(centroidArray)
                if dist > maxDist:
                    maxDist = dist
                    graphCoordinate = pixel.graphCoordinate
            centroid = Centroid(graphCoordinate)
            centroidArray.append(centroid)


        return centroidArray

    def printResult(self, path, size, centroidArray):
        for centroid in centroidArray:
            pixelList = []
            for i in range(0, size[0] * size[1]):
                pixelList.append((0, 0, 0))
            for pixel in centroid.members:
                pixelList[pixel.picturePosition] = pixel.graphCoordinate
            resultImage = Image.new("RGB", size)
            resultImage.putdata(pixelList)
            resultImage.save(path + "out-" +    str(centroidArray.index(centroid)) + ".jpg")


    def getImageData(self, inputPath):
        image = Image.open(inputPath)
        image = image.convert("RGB")
        size = image.size
        pixelList = []
        for y in range(0, size[1]):
            for x in range(0, size[0]):
                color = image.getpixel((x, y))
                pixelPos = y * size[0] + x
                pixel = Pixel(pixelPos, color)
                pixelList.append(pixel)
        return size, pixelList

我的工具.py公司名称:

^{pr2}$

给你像素.py公司名称:

class Pixel:

    def __init__(self, position, coordinate):
        self.graphCoordinate = coordinate
        self.picturePosition = position

给你质心.py公司名称:

class Centroid:

    def __init__(self, coordinate):
        self.graphCoordinate = coordinate
        self.members = []

最后呢主.py在

from Algo import Algo

algo = Algo();
algo.run("input/Stonehenge.jpg", "output/", 3, 100)

Tags: inpyimportself算法forsizedist