Как правильно преобразовать трехмерный массив в непрерывные байты RGB

Я пытаюсьпреобразовать массив 3d, возвращаемый cv2.imread, в непрерывный байтовый массив rgb, для отображения в GTK. И ниже мой код конверсии:

def ndarr2rgb(img):
    r_arr = img[:, :, 0].ravel()    # read channel
    g_arr = img[:, :, 1].ravel()    # green channel
    b_arr = img[:, :, 2].ravel()    # blue channel
    numItems = img.shape[0] * img.shape[1] * img.shape[2]   # number of entries in byte array
    z = img.shape[2]                # z dimension, always equal to 3
    arr = np.zeros((numItems, 1))
    # to fill the byte array with r,g,b channel
    for i in xrange(0, numItems):
        if i % z == 0:
            arr[i] = r_arr[i/z]
        if i % z == 1:
            arr[i] = g_arr[i/z]
        if i % z == 2:
            arr[i] = b_arr[i/z]
    return arr

Итак, в моем коде я сначала получаю три измерения отдельно в r_arr, g_arr, b_arr, затем помещаю значения в порядке или RGB в 'arr'. Таким образом, после итерации массив 'arr' будет выглядеть как 'r0, g0, b0, r1, g1, b1, ...'

А потом пользуюсьGdkPixbuf.Pixbuf.new_from_data"функция, чтобы получить pixbuf из arr, возвращаемого"ndarr2rgb«Функция выше. И я использую»image.set_from_pixbuf«для отображения изображения. Но я получил следующий результат:
 Это похоже на шумную зону, поэтому, пожалуйста, помогите мне решить мою проблему, спасибо.

Ответы на вопрос(4)

Ваш ответ на вопрос