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