Преобразование изображения в оттенках серого (которое ранее было преобразовано из цветного изображения) в цветное изображение с использованием PIL?

#python #python-3.x #image #python-imaging-library

#python #python-3.x #изображение #python-imaging-library

Вопрос:

Итак, я написал код, который скрывает данные в изображении в оттенках серого и может извлекаться обратно из изображения в оттенках серого. Я хочу иметь возможность делать это для цветного изображения. На данный момент я думаю преобразовать цветное изображение в оттенки серого, скрыть данные, преобразовать изображение обратно в цвет. Если это возможно. Еще одна вещь, о которой я думаю, заключается в том, что для оттенков серого getpixel возвращает единственное значение, в то время как для цвета getpixel возвращает кортеж, поэтому я также подумал о том, чтобы просто манипулировать только одним значением кортежа (если это правильно).

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

 from PIL import Image
import numpy as np
import glob
import os
from helper import tobits

image_list = []

for filename in glob.glob('*.png'):
  image_list.append(filename)
print(image_list)




#onlyforalphas
message = "he23@"*200
#print(message)
messagebi = ''.join(format(ord(x), '07b') for x in message)
#messagebi = tobits(message)
#print(messagebi)

payload = len(messagebi)

print(".........................PAYLOAD LENGTH : ", payload, "..................................................")

width = 512
height = 512

max_a = 0
min_b = 0

max_value = 0
min_value = 10000

z = 0
zi = 0
fileindex = 0
im = Image.open(image_list[0])
#print(im.histogram())
while payload > 0 and z < len(image_list):
  print(".........................PAYLOAD LENGTH : ", payload, "..........................................")
  print("OPENING FILE", image_list[z])
  im = Image.open(image_list[z])
  #print(im.histogram())
  z = z   1
  hist_list = np.asarray(im.histogram())
  print(im.histogram())
  for i in range(len(hist_list)):
    if hist_list[i] >= max_value:
      max_value = hist_list[i]
      max_a = i
    if hist_list[i] <= min_value:
      min_value = hist_list[i]
      min_b = i
  if payload > max_value:
    print("ERROR:payload size: ", payload, " too large. Trying another image")

  hist_list = np.asarray(im.histogram())    
  print(max_a, " ", max_value)
  print(min_b, " ", min_value)
  payload = payload - max_value
  if payload < 0:
    payload = 0
  hist_list[max_a] = 0
  #zi = 0
  messagelength = len(messagebi)
  #print(messagebi, "   ", messagelength)
  for i in range(width):
      for j in range(height):
          temp = im.getpixel((i,j))[0]
          #print(temp)
          if  temp > max_a and temp < min_b:
              im.putpixel((i,j), temp   1)
              #print(im.getpixel((i,j)), end = "")
          if zi < messagelength and messagebi[zi] == '1' and temp == max_a:
              im.putpixel((i,j), max_a 1)
              zi = zi   1
          elif zi < messagelength and messagebi[zi] == '0' and temp == max_a:
              zi = zi   1
      #print("")
  #imnu = Image.fromarray(hist_list, mode='L')
  print("payload size after ", fileindex, "iteration is:", payload)
  filename = "output/filename"   str(fileindex)   ".png"
  im.save(filename)
  fileindex = fileindex   1
  print(im.histogram())

  

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

1. Покажите, что вы пробовали

2. @Alderven опубликовал