Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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 K表示图像分割失败_Python_Algorithm_Python 2.7_K Means_Image Segmentation - Fatal编程技术网

Python K表示图像分割失败

Python K表示图像分割失败,python,algorithm,python-2.7,k-means,image-segmentation,Python,Algorithm,Python 2.7,K Means,Image Segmentation,我目前正在使用K-means算法制作一个图像分割程序 以下是我所做工作的总结: 使用lite spread算法创建N个质心(获得了更好的结果 (非随机) 将每个像素指定给最近的质心 将质心位置更改为“质心” 重复2和3,直到没有任何变化 为了确定质心,我取所有指定给质心的像素的平均位置 我的问题是,当图片非常简单时,它的工作很好: 但当我使用更复杂的图片时(而这张图片根本不是“真正复杂的”) 我真的不确定这为什么不能很好地工作,我仔细检查了我的代码,没有发现算法有任何错误,问题不在于算法

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

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

  • 使用lite spread算法创建N个质心(获得了更好的结果 (非随机)
  • 将每个像素指定给最近的质心
  • 将质心位置更改为“质心”
  • 重复2和3,直到没有任何变化
为了确定质心,我取所有指定给质心的像素的平均位置

我的问题是,当图片非常简单时,它的工作很好:

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

我真的不确定这为什么不能很好地工作,我仔细检查了我的代码,没有发现算法有任何错误,问题不在于算法的选择,我认为,因为很多人在互联网上用K均值显示分割良好的图片

如果你对我如何提高成绩有一些想法

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

我正在使用python 2.7

我的算法:

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
这里是Pixel.py:

class Pixel:

    def __init__(self, position, coordinate):
        self.graphCoordinate = coordinate
        self.picturePosition = position
这里是Centroid.py:

class Centroid:

    def __init__(self, coordinate):
        self.graphCoordinate = coordinate
        self.members = []
最后是main.py

from Algo import Algo

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

Algo.py
存在缩进问题。你能再检查一下这个文件吗?已编辑,对不起,你希望得到什么结果?在我看来,您的代码在从照片中分离暗、光和中等值方面做得相当好。我想要,3部分,草、天空和石头。我真的不知道Kmeans是否能做到这一点,但我想分割我的图像,这里的分割看起来是破碎的。我应该使用其他算法吗?尝试基于色调和饱和度(忽略亮度)而不是RGB值进行分割。您必须为色调设置距离函数“环绕”。
from Algo import Algo

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