Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2014 17:15:58

nikk
От:
Зарегистрирован: 2010-11-09
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

получить срез для объекта Image.load()

Доброго времени суток.
Нужно посчитать количество чёрных пикселей в строке. Делаю так:

im1 = Image.open("2.png")
def bw_filter(threshold=127):
	def table_gen(x):
		return 0 if x < threshold else 255
	return table_gen
 
new = im1.convert("L").point(bw_filter(200)).convert("1")
shir = new.size[0]
vys = new.size[1]
pix = new.load()
str_mas = []
for y in range(vys):
	sum_str = 0
	for x in range(shir):
		sum_str += pix[x,y]/255
	str_mas.append(shir - sum_str)

работает медленно, секунд пять на изображении формата А4. Объект pix, как я понимаю, это какой-то извратный массив. Как из него получить срез(строку), чтобы скормить эту строку sum и не ходить в цикле? Вот так:

 pix[:,y]

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



Отредактировано nikk (Янв. 19, 2014 21:05:41)

Офлайн

#2 Янв. 23, 2014 15:45:34

skavans
Зарегистрирован: 2012-11-13
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

получить срез для объекта Image.load()

Это не извратный массив. pix - объект, переопределяющий магический метод __getitem__, принимающий на вход кортеж из двух чисел. Так что срез не получить. Можете попровать так:

sums = [sum(pix[x,y] / 255 for x in xrange(shir)) for y in xrange(vys)]

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

Отредактировано skavans (Янв. 23, 2014 15:49:10)

Офлайн

#3 Янв. 24, 2014 11:26:35

nikk
От:
Зарегистрирован: 2010-11-09
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

получить срез для объекта Image.load()

Сделал в результате через scipy, там буквально две строчки получилось. Позже выложу код, сейчас с телефона.
Ещё бы найти, как с помощью scipy конвертировать из оттенков серого в чёрно-белое и от Pillow можно отказаться совсем. Может кто подскажет?



Офлайн

#4 Янв. 24, 2014 20:08:46

nikk
От:
Зарегистрирован: 2010-11-09
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

получить срез для объекта Image.load()

В общем, сам уже во всём разобрался. Построчная сумма по изображению считается так (для изображения в оттенках серого):

iz = misc.imread ( "3.png", True )
vys,shir = iz.shape
str_mas = iz.sum(axis = 1)
str_mas = str_mas/255
str_mas =shir - str_mas

делить на 255 нужно, так как в оттенках серого белый цвет это не 1, а 255. Ну или предварительно перевести в чёрно-белое:

new = numpy.where(iz < 200, 0, 1)

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

Как итог - в топку Pillow, scipy гораздо мощнее и более гибкий, всё делается в пару строк и шустро. Например, этот код считает суммы по строкам примерно за 0,7 секунды на том же изображении, где код для Pillow работал 5-6 секунд.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version