Как я могу реализовать падение канала изображения с помощью python lib of pillow - PullRequest
1 голос
/ 26 мая 2019

Мне нужно случайно обнулить 0, 1 или 2 канала изображения подушки. Это означает, что мне нужно произвольно установить 0, 1 или 2 канала изображения на 0.

Как я могу сделать это с помощью пил?

Ответы [ 3 ]

1 голос
/ 27 мая 2019

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

newRed   = 1*oldRed  +  0*oldGreen  +  0*oldBlue  + constant
newGreen = 0*oldRed  +  1*OldGreen  +  0*OldBlue  + constant
newBlue  = 0*oldRed  +  0*OldGreen  +  1*OldBlue  + constant

Затем я просто изменяю 1 на 0, где я хочу обнулить канал.

#!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('input.png').convert("RGB")

# Pre-set R, G and B multipliers to 1
Rmult, Gmult, Bmult = 1, 1, 1

# Select one (or more) channels to zero out, I choose B channel here
Bmult=0

# Make transform matrix
Matrix = ( Rmult, 0, 0, 0,
           0, Gmult, 0, 0,
           0, 0, Bmult, 0)

# Apply transform and save
im = im.convert("RGB", Matrix)
im.save('result.png')

Итак, если вы начнете с этого:

enter image description here

и вы установите нулевой множитель Blue (Bmult), вы получите:

enter image description here

Если вы обнулите Красный и Синий с помощью:

Rmult = Bmult = 0 

, вы получите:

enter image description here

1 голос
/ 26 мая 2019

Вы пробовали использовать Numpy? Это довольно просто.

import numpy as np
import PIL.Image as Image
img = np.array(Image.open("image1.jpg")) # My Image
c = np.random.randint(3, size=1)[0] # Selecting a random channel c
img[:,:,c] = img[:,:,c] * 0 # channel c times 0.
0 голосов
/ 27 мая 2019

TRY: -

from PIL import Image
import random

# Provide path to your image
img = Image.open(r"Image_Path")

# Converting the Image's mode to RGB, coz you wanted a random channel out of 3 channels
img.convert("RGB")

# Getting individual channels off the image
r, g, b = img.split()

# choice will store a random number b/w 0-2 we will use this value to extract a random channel
choice = random.randrange(0, 3)
null_channel = (r, g, b)[choice]

# printing the index of our randomly selected channel, ( 0 = Red; 1 = Green; 2 = Blue)
print(choice)

# changing each individual pixel value to 0, of our randomly selected channel
null_channel = null_channel.point(lambda p: 0)

# These conditions will provide the null channel to it's original channel's variable
if choice is 1:
    g = null_channel

elif choice is 2:
    b = null_channel

else:
    r = null_channel

# creating a new image with the original two channels' and our null'd channel
new_img = Image.merge("RGB", (r, g, b))

new_img.save("new_img.jpg")

Приведенный выше код сначала преобразует цветовой режим изображения в RGB, чтобы мы могли работать с 3 каналами. Затем он будет извлекать отдельные каналы изображения. Затем он выберет случайный канал из 3 каналов и преобразует значение каждого пикселя этого канала в (0, 0, 0). Затем он выяснит, какой канал был изначально использован (R или G или B), а затем перезапишет измененные значения в канал. В конце он создаст объект изображения, объединив все новые каналы и сохранив его.

Образец изображения: -

enter image description here

Изображение после модификации: -

enter image description here

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

...