Более быстрый способ отделить зеленый канал изображения

#python #performance #numpy #image-processing #python-imaging-library

#python #Производительность #numpy #обработка изображений #python-imaging-library

Вопрос:

Я использую следующий код, чтобы отделить зеленый канал изображения в отдельный файл .jpeg с помощью PIL и numpy.

 from PIL import Image
import numpy as np

im = Image.open('image.jpg')
im = np.array(im)
im[:,:,0] *=0
im[:,:,2] *=0
im = Image.fromarray(im,'RGB')
im.save('greened.jpg')
  

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

Есть ли какой-либо другой способ сделать то же самое более быстрым способом?

Комментарии:

1. Профилируйте свой код. Что занимает больше всего времени? Я предполагаю, im.save . Если это так, нет возможности ускорить ваш код.

Ответ №1:

Вы могли бы назначить нули за один раз, и вам даже не нужно будет умножать на 0

 im[:,:,[0,2]] = 0
  

Комментарии:

1. О, вы сделали программу на полмиллиона секунд быстрее.

Ответ №2:

Если вы можете использовать opencv, вы можете ускорить его, избегая построения массива numpy и обратного преобразования в изображение.

Я пытался:

В среднем это заняло 0.011458 секунду (10).

 @tm_it
def with_PIL():
    im = imag.open('C:/Users/srlatch/Desktop/shi.jpg')
    im = np.array(im)
    im[:,:,0] *=0
    im[:,:,2] *=0
    im = imag.fromarray(im,'RGB')
    im.save('greened.jpg')
  

В среднем это заняло 0.000474981 секунду (10):

 @tm_it
def with_open_cv():
    image=cv2.imread('C:/Users/srlatch/Desktop/shi.jpg')
    image[:,:,[0,2]] = 0
    cv2.imwrite('result.jpg',image)