Найти - Пользователи
Полная версия: получить срез для объекта Image.load()
Начало » Python для новичков » получить срез для объекта Image.load()
1
nikk
Доброго времени суток.
Нужно посчитать количество чёрных пикселей в строке. Делаю так:

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]

не работает, выдаёт ошибку. Или может есть другие способы решения данной задачи?
skavans
Это не извратный массив. pix - объект, переопределяющий магический метод __getitem__, принимающий на вход кортеж из двух чисел. Так что срез не получить. Можете попровать так:
sums = [sum(pix[x,y] / 255 for x in xrange(shir)) for y in xrange(vys)]

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

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 секунд.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB