Преобразование изображения в градациях серого (которое ранее было преобразовано из цветного изображения) в цветное изображение с использованием PIL? - PullRequest
0 голосов
/ 30 марта 2019

Итак, я написал код, который скрывает данные в изображении в градациях серого и может извлекать их из изображения в градациях серого.Я хочу быть в состоянии сделать это для цветного изображения.В данный момент я думаю преобразовать цветное изображение в оттенки серого, скрыть данные, преобразовать изображение обратно в цвет.Если это возможно.Я думаю, что для оттенков серого getpixel возвращает одно значение, а для color 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())

...