private static ClusterIndices4X4 CreateClusterIndexBlock(RawBlock4X4Rgba32 raw, out int outputNumClusters, int numClusters = 3) { ClusterIndices4X4 indexBlock = new ClusterIndices4X4(); var indices = LinearClustering.ClusterPixels(raw.AsSpan, 4, 4, numClusters, 1, 10, false); var output = indexBlock.AsSpan; for (int i = 0; i < output.Length; i++) { output[i] = indices[i]; } int nClusters = indexBlock.NumClusters; if (nClusters < numClusters) { indexBlock = indexBlock.Reduce(out nClusters); } outputNumClusters = nClusters; return(indexBlock); }
public void Clusterize() { using var testImage = ImageLoader.testBlur1.Clone(); var pixels = testImage.GetPixelSpan(); int numClusters = (testImage.Width / 32) * (testImage.Height / 32); var clusters = LinearClustering.ClusterPixels(pixels, testImage.Width, testImage.Height, numClusters, 10, 10); ColorYCbCr[] pixC = new ColorYCbCr[numClusters]; int[] counts = new int[numClusters]; for (int i = 0; i < pixels.Length; i++) { pixC[clusters[i]] += new ColorYCbCr(pixels[i]); counts[clusters[i]]++; } for (int i = 0; i < numClusters; i++) { pixC[i] /= counts[i]; } for (int i = 0; i < pixels.Length; i++) { pixels[i] = pixC[clusters[i]].ToRgba32(); } using var fs = File.OpenWrite("test_cluster.png"); testImage.SaveAsPng(fs); }