像素化自调用函数解释请求

时间:2016-06-19 19:52:59

标签: python rgb

这个功能究竟做了什么?据我所知,它在三个不同的列表(较小,枢轴,更大)中按亮度对像素进行排序。但我不太清楚如何,自我调用的方面真的令人困惑。 我对python和编程一般都不是很熟悉。

def quick_sort(pixels):
#Quicksort function that sorts pixels based on combined RGB values (R + B + G)
if pixels == []:
    return pixels

else:
    pivot = pixels[0]
    lesser = quick_sort([x for x in pixels[1:] if (x[0] + x[1] + x[2]) < (pivot[0] + pivot[1] + pivot[2])])
    greater = quick_sort([x for x in pixels[1:] if (x[0] + x[1] + x[2]) >= (pivot[0] + pivot[1] + pivot[2])])
    return lesser + [pivot] + greater

原始代码: 版权所有(c)2014 Lycaon(lycaon.me)

1 个答案:

答案 0 :(得分:0)

只是对3D矢量数组的着名快速排序算法的简单实现。参考算法是: https://en.wikipedia.org/wiki/Quicksort

如果要对[5 2 8 4 1 7 9]进行排序,则选择“pivot”,并将元素分为两组:小于和大于枢轴。然后,您递归调用排序算法。

对于上一个示例,将第一个值选为“pivot”(标有星号)会将数组拆分为:

[5* 2 8 4 1 7 9] = [2 4 1] + 5* + [8 7 9]. 

然后,您需要在[2 4 1]和[8 7 9]上递归应用算法,结果数组将被排序。递归调用将给出:

[2* 4 1] = [1] + 2* + [4]
[8* 7 9] = [7] + 8* + [9]

所以:

[5 2 8 4 1 7 9] = [1 2 4 5 7 8 9]

算法的伪代码是:

def mergesort(array): 
    pivot = array[0]
    lessThan = [x for x in array[1:] if x < pivot]
    greaterThan = [x for x in array[1:] if x <= pivot]

    return mergesort(lessThan) + [pivot] + mergesort(greaterThan)

这里,参考实现有一个小的改动:我们不比较数组的元素(它应该按照lexiographic顺序比较像素)。它比较像素的所有分量的总和。这就是代码的原因:

pixel[0] + pixel[1] + pixel[2] <= pivot[0] + pivot[1]+pivot[2]