Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
0x1123
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 12
1

возможно ли оптимизировать функцию

12.12.2016, 04:14. Просмотров 206. Ответов 5
Метки нет (Все метки)

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

есть фунция white_around для поиска белых пикселей вокруг заданного белого пикселя.
пример для пикселя с координатами (3,3) с картинки

Python
1
2
>>> white_around(img, 3,3)
[(3,3),(3,4),(4,3),(2,3),(3,2)]
Затем формируется белая зона путем применения white_around на последующие белые пиксели.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PIL import Image
 
def make_zone(img,x,y):
    s=stack.create() #white pixels stack
    color=img.getpixel((x,y))
    li=[]
    if color==(255,255,255): # если белый
        stack.push((x,y),s)
        l=white_around(img,x,y)
    l_obrabotka=[x for x in l if x not in s] # на эти пиксели применяется функция
    while l_obrabotka != []:
        for i in range(len(l_ob)):
            stack.push((l_ob[i][0],l_ob[i][1]),s)
            li.append(white_around(img, l_ob[i][0],l_ob[i][1]))
        l_obrabotka=list(set([x for x in sum(li,[]) if x not in s]))
    for pixel in range(len(s)):
        change_color(img,s[pixel][0],s[pixel][1],(255,0,0)) # замена цвета зоны для наглядности
    img.save('colored.png')
    return s
Функция сначала формирует список с белыми пикелями, затем ищет их белых "соседей" и потом обработанные пиксели добавляет в стек и снова ищет соседей для уже новых пикселей, отправляя в стек обработанные.
Она отлично работает для маленьких изображений, но для нормальных изображений считает зоны по 20 минут.
Что я делаю не так?
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2016, 04:14
Ответы с готовыми решениями:

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

Возможно ли оптимизировать код
Задача: (x+2)2-(y-3)2,если x2-y2<2 z= x2-y2-1,иначе ...

Возможно ли оптимизировать код?
Доброго времени суток, Господа! Прошу о помощи. Имеется макрос, который...

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

Оптимизировать функцию
Помогите оптимизировать функцию она работает правильно только очень медленно...

5
oldnewyear
411 / 409 / 156
Регистрация: 21.05.2016
Сообщений: 1,320
12.12.2016, 05:12 2
1. Что такое l_ob в 12 строке?
2.
Python
1
2
3
4
 
if color==(255,255,255): # если белый
    stack.push((x,y),s)
    l=white_around(img,x,y)
Если цвет не белый, список l не будет определен и программа завершится с ошибкой

3. Насколько принципиально необходимо использовать стек? Может заменить его не set()?
0
0x1123
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 12
13.12.2016, 00:35  [ТС] 3
oldnewyear,
1. это l_obrabotka, моя ошибка
2. не может быть не белым потому что предыдущая функция white_around добавляет в стек только белые пиксели. Точно, значит условие тут вообще не нужно.
3. стек просто удобнее использовать в этой работе. она вся строится на стеках и списках кортежей.
0
oldnewyear
411 / 409 / 156
Регистрация: 21.05.2016
Сообщений: 1,320
13.12.2016, 00:44 4
Цитата Сообщение от 0x1123 Посмотреть сообщение
oldnewyear,
3. стек просто удобнее использовать в этой работе. она вся строится на стеках и списках кортежей.
Мне это совершенно не очевидно. В стеке важна очередность добавления данных, у вас какая в этом необходимость? Если заменить на set должно работать гораздо быстрее, не нужно будет по стеку туда сюда бегать по сто раз, проверяя есть там уже значение или нет
1
0x1123
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 12
13.12.2016, 01:03  [ТС] 5
oldnewyear, спасибо за объяснение, сейчас попробую
0
askurandrio
Заблокирован
15.12.2016, 09:47 6
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def get_lpixel(cnt_x, cnt_y, dis=1): # возвращает бесконечный итератор на архимедову спираль кординат
  y_up, y_down = cnt_y + dis, cnt_y - dis
  x_left, x_right = cnt_x - dis, cnt_x + dis
  y_up = y_up if y_up >= 0 else 0
  y_down = y_down if y_down >= 0 else 0
  x_left = x_left if x_left >= 0 else 0
  x_right = x_right if x_right >= 0 else 0
  for x in range(x_left, x_right+1):
    yield (x, y_up)
  for x in range(x_left, x_right+1):
    yield (x, y_down)
  for y in range(y_down, y_up+1):
    yield (x_left, y)
  for y in range(y_down, y_up+1):
    yield (x_right, y)
  for i in get_lpixel(cnt_x, cnt_y, dis+1):
    yield i
 
 
def make_zone(img, x, y):
    s = set()
    for cord in img.get_pixel(x, y):
        if cord in s:
            continue
        color = img.getpixel(cord)
        if color != (255,255,255):
            break
        s.add(cord)
    return s
не факт что будет точно прямоугольная область(куски линий могут быть), но мне лень понимать как это исправить.)
0
15.12.2016, 09:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2016, 09:47

Нужно оптимизировать функцию
Немножко не шарю но она должна сортировать пузырьком: #include <iostream> ...

Оптимизировать функцию под BackgroundWorker
всем привет! у меня в проекте имеется функция получения ответа от сервера с/без...

Как немного оптимизировать функцию?
Здравствуйте всем! Сейчас писал этот функцию для проекта но немного он не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru