Итак, сама идея неплохая, это был просто мой тупой мозг 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. И теперь это работает.
Как все уже предположили, странные цвета, которые Вы наблюдаете, являются переполнением. И поскольку Вы указываете в комментарий ответа 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 заботится о переполнении неявно в одной из его функций.
Используя смешение 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')
Это кажется кодом, который Вы отправили, просто подводит итог значений и оценивает больше, чем 256, переполняются. Вы хотите что-то как" (+ b) / 2 дюйма или "минута (+ b, 256)". Последний, кажется, способ, которым Ваш пример Matlab делает это.
Для фиксации numpy выстраивают значения:
>>> c = a + b
>>> c[c > 256] = 256
Ваши демонстрационные изображения не обнаруживаются, формируют меня так, я собираюсь сделать немного предположения.
я не могу помнить точно, как 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 делает