NumPy, PIL добавление изображения

Итак, сама идея неплохая, это был просто мой тупой мозг xD. EventBust не показывал, что вызвало исключение, поэтому я просто поместил код в try-catch:

public void onEventMainThread(EventAppStateChanged event) {
        if (event.isState(AppState.NORMAL)) {
            Log.i(TAG, "EventAppStateChanged (to NORMAL) received");
            try {
                for (Runnable runnable : toBeExecutedList) {
                    Log.i(TAG, "FutureExecutor executing Runnable: " + runnable);
                    VCEngine.getHandler().postDelayed(runnable, 10);
                    toBeExecutedList.remove(runnable);
                }
            } catch (Exception e) {
                Log.e(TAG, "FutureExecutor exception: ");
                e.printStackTrace();
            }
        }
    }

И я обнаружил, что удаляю элемент списка внутри цикла for. Это можно решить с помощью итератора или просто очистив список после цикла for. И теперь это работает.

23
задан rem7 9 May 2013 в 15:00
поделиться

5 ответов

Как все уже предположили, странные цвета, которые Вы наблюдаете, являются переполнением. И поскольку Вы указываете в комментарий ответа schnaader , Вы все еще становитесь водосливными , если Вы добавляете свои изображения как это:

addition=(im1arr+im2arr)/2

причина этого переполнения состоит в том, что Ваш NumPy выстраивает ( im1arr im2arr), имеют тип uint8 (т.е. 8-разрядный). Это означает, что каждый элемент массива может только содержать значения до 255, поэтому когда Ваша сумма превышает 255, это циклично выполняет назад приблизительно 0:

>>>array([255,10,100],dtype='uint8') +  array([1,10,160],dtype='uint8')
array([ 0, 20,  4], dtype=uint8)

Для предотвращения переполнения массивы должны смочь содержать значения вне 255. Вам нужно к [1 115], преобразовывают их в плавания , например, выполняют операцию смешивания, и преобразовывают результат назад в uint8:

im1arrF = im1arr.astype('float')
im2arrF = im2arr.astype('float')
additionF = (im1arrF+im2arrF)/2
addition = additionF.astype('uint8')

Вы не должны делать это:

addition = im1arr/2 + im2arr/2

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

примечание MATLAB: причина Вы не видите эту проблему в MATLAB, вероятно, потому что MATLAB заботится о переполнении неявно в одной из его функций.

32
ответ дан Community 29 November 2019 в 01:27
поделиться

Используя смешение PIL () с альфа-значением 0,5 было бы эквивалентно (im1arr + im2arr)/2. Смешение не требует, чтобы изображения имели альфа-слои.

Попытка это:

from PIL import Image
im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')
Image.blend(im1,im2,0.5).save('/Users/rem7/Desktop/a.jpg')
18
ответ дан Paul 29 November 2019 в 01:27
поделиться

Это кажется кодом, который Вы отправили, просто подводит итог значений и оценивает больше, чем 256, переполняются. Вы хотите что-то как" (+ b) / 2 дюйма или "минута (+ b, 256)". Последний, кажется, способ, которым Ваш пример Matlab делает это.

2
ответ дан schnaader 29 November 2019 в 01:27
поделиться

Для фиксации numpy выстраивают значения:

>>> c = a + b
>>> c[c > 256] = 256
1
ответ дан jfs 29 November 2019 в 01:27
поделиться

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

я не могу помнить точно, как numpy к pil работам преобразования, но существуют два вероятных случая. Я на 95% уверен, что это 1, но дает 2 на всякий случай, я неправ. 1) 1 im1Arr является массивом MxN целых чисел (ARGB) и когда Вы добавляете im1arr и im2arr вместе, Вы переполняетесь от одного канала в следующее если компоненты b1+b2> 255. Я предполагаю, что matlab представляет их изображения, поскольку массивы MxNx3 так каждый цветовой канал являются отдельными. Можно решить это путем разделения каналов изображения PIL и затем создания numpy массивов

2), 1 im1Arr является массивом MxNx3 байтов и когда Вы добавляете im1arr и im2arr вместе, Вы переносите компонент.

Вы также оказываетесь перед необходимостью повторно масштабировать диапазон назад к между 0-255 перед отображением. Ваш выбор является делением 2, масштабом 255/array.max () или делает клип. Я не знаю то, что matlab делает

0
ответ дан hacken 29 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: