Numpy.putmask с изображениями

У меня есть изображение, преобразованное в ndarray с значениями RGBA. Предположим, что это 50 x 50 x 4.

Я хочу заменить все пиксели на array([255, 255, 255, 255]) значений array([255, 255, 255, 255]) для array([0, 0, 0, 0]) . Так:

 from numpy import * from PIL import Image def test(mask): mask = array(mask) find = array([255, 255, 255, 255]) replace = array([0, 0, 0, 0]) return putmask(mask, mask != find, replace) mask = Image.open('test.png') test(mask) 

Что я делаю не так? Это дает мне значение ValueError: putmask: mask and data must be the same size . Но если я изменю массивы на числа (find = 255, replace = 0), это сработает.

  • Поместите данные в список особого вида
  • Правильная установка с scipy curve_fit, включая ошибки в x?
  • Как распечатать отчет о классификации scikit?
  • Преобразование многоканального файла PyAudio в массив NumPy
  • Улучшение многократной реализации простой весенней сети
  • Поиск строки с наивысшим средним значением в массиве numpy
  • Высокопроизводительная переменная размытия в очень больших изображениях с использованием Python
  • Как заставить scipy.interpolate дать экстраполированный результат за пределами диапазона ввода?
  • 3 Solutions collect form web for “Numpy.putmask с изображениями”

    Один из способов сделать это маскирование каналов – это разбить массив на r, g, b, каналы, а затем определить индекс с помощью операций с numpy-логическим битом:

     import numpy as np import Image def blackout(img): arr = np.array(img) r,g,b,a=arr.T idx = ((r==255) & (g==255) & (b==255) & (a==255)).T arr[idx]=0 return arr img = Image.open('test.png') mask=blackout(img) img2=Image.fromarray(mask,mode='RGBA') img2.show() 

    Более краткий способ сделать это

     img = Image.open('test.png') a = numpy.array(img) a[(a == 255).all(axis=-1)] = 0 img2 = Image.fromarray(a, mode='RGBA') 

    В более общем плане, если элементы find и repl не все одинаковы, вы также можете сделать

     find = [1, 2, 3, 4] repl = [5, 6, 7, 8] a[(a == find).all(axis=-1)] = repl 

    Это решение использует putmask и я думаю, что он наиболее близок к OPs-коду. В исходном коде, который должен знать OP, есть две ошибки: 1) putmask – это операция на месте. Он возвращает None . 2) putmask также требует массивы одинакового размера. Он (слишком плохой) не имеет аргумента ключевого слова axis .

     import numpy as np from PIL import Image img1 = Image.open('test.png') arry = np.array(img1) find = np.array([255, 255, 255, 255]) repl = np.array([ 0, 0, 0, 0]) # this is the closest to the OPs code I could come up with that # compares each pixel array with the 'find' array mask = np.all(arry==find, axis=2) # I iterate here just in case repl is not always the same value for i,rep in enumerate(repl): # putmask works in-place - returns None np.putmask(arry[:,:,i], mask, rep) img2 = Image.fromarray(arry, mode='RGBA') img2.save('testx.png') 
    Interesting Posts

    TypeError: объект «RelatedManager» не является итерируемым

    Как определить, идентичны ли два раздела (кластеризации) точек данных?

    Где я могу найти и установить зависимости для pygame?

    установить pythonpath перед операциями импорта

    KenKen puzzle addends: REDUX A (исправленный) нерекурсивный алгоритм

    эквивалент задержки торнадо

    группировка объектов для достижения аналогичного среднего свойства для всех групп

    Работа с несколькими версиями python, когда файлы python должны использовать #! / Bin / env python

    Как вычислить эвклидовое расстояние между парой строк массива numpy

    Укладка многострочных условий в выражениях «если»?

    Как определить, является ли ввод пользователем допустимым шестнадцатеричным числом?

    Python (pip) бросает , даже если обновлена ​​цепочка сертификатов

    Может ли метод Python проверить, вызван ли он изнутри?

    Можно ли полагаться на порядок оценки условий в операторах if?

    Kivy: Как заставить виджет вести себя как переполнение: скрытый

    Python - лучший язык программирования в мире.