Найдите существенное изменение в списке в Python

Итак, у меня есть этот фрагмент кода

for x in range(x1,x2):
        for y in range(y1, y2):
            cpixel = pixels[x, y]
            if bw:
                bw_value = int(round(sum(cpixel) / float(len(cpixel))))
                all_pixels.append(bw_value)
                title = "Averaged (B&W) Pixel Values"
            else:
                if lumi:
                    luma = (0.3 * cpixel[0]) + (0.59 * cpixel[1]) + (0.11 * cpixel[2])
                    all_pixels.append(luma)
                    title = "Pixel Luminosity Values"
                else:
                    if round(sum(cpixel)) / float(len(cpixel)) > 100:
                        all_pixels.append(255)
                    else:
                        all_pixels.append(0)
                    title = "Pixel Binary Transform Values"

взяты и немного изменены отсюда Получение списка значений пикселей из PIL чтобы предоставить список значений пикселей (all_pixels) в пределах ограничивающей области (выбранной пользователем).

Я пытаюсь найти эффективный способ обнаружения изменений в списке после записи серии похожих значений. Поскольку кажется, что в списке перечислены значения пикселей сверху вниз и слева направо. В сценарии, в котором я буду его использовать, у него будет список похожих значений, пока он не попадет в область изображения, где значения затем начнут переключаться назад и вперед, пока значения снова не стабилизируются вокруг нового значения.

Меня интересует отслеживание границы между этими двумя, я хочу определить, где находится эта граница и смещается ли она влево или вправо. Я не могу придумать другого способа, кроме как проверять каждое значение, добавленное к all_pixels, а затем просто отслеживать координаты.

Но даже это кажется довольно схематичным, поскольку даже если я установил одинаковое количество значений до следующего, которое значительно отличается, это будет рассматриваться как существенное изменение, а не просто выброс, после этого значения начинают переключаться между старыми значениями. и новые.

Я предполагаю, что в идеале мне нужно было бы создать какую-то лучшую линию для координат этой граничной области / линии. Мне просто нужны идеи, как подойти к этой проблеме.


person DamianJ    schedule 14.06.2012    source источник
comment
Что именно вы имеете в виду под «существенным изменением»? И для чего это? Похоже, вы хотите отслеживать движение.   -  person Junuxx    schedule 14.06.2012
comment
Действительно, в основном у меня есть порошок в цилиндре, и я хочу отслеживать его объем, поскольку он уплотняется после постукивания. Граница, о которой я говорю, - это линия верхней части порошка, образованная его тенью. Таким значительным будет любое значение, превышающее значение, создаваемое теневой областью. Обычно я делаю снимок после каждого нажатия, и именно так я пытаюсь отследить его изменение.   -  person DamianJ    schedule 14.06.2012


Ответы (2)


Основываясь на описании проблемы в вашем комментарии, я думаю, что может быть достаточно простого детектора края, хотя это будет зависеть от таких вещей, как угол камеры, контраст, освещение и т. Д.

Вы можете взять производную изображения по вертикали, возможно, немного сгладить ее и найти строку с самыми высокими значениями. Предполагая, что изображение увеличено на цилиндре без каких-либо других серьезных вертикальных контрастов, кроме границы порошка, это должна быть высота порошка.

Вы можете запрограммировать это самостоятельно или использовать OpenCV, но я думаю, что это может быть немного непосильно для этой задачи. Numpy также будет хорошим вариантом.

person Junuxx    schedule 14.06.2012
comment
Спасибо за предложения, посмотрю, что у меня получится. - person DamianJ; 14.06.2012

Судя по вашему описанию, вам действительно следует просто использовать библиотеку компьютерного зрения, а не пытаться написать свой собственный код обнаружения изображений.

Вот обсуждение компьютерного зрения в Python: Какая хорошая библиотека компьютерного зрения для Python позволит мне находить лица в видео Flash / HTML5?

Похоже, OpenCV - лучший выбор.

http://opencv.willowgarage.com/

person steveha    schedule 14.06.2012