Dieses Projekt dient der digitalen Umwandlung von Bildern in simulierte Darstellung aus Sicht eines rot-grün-blinden Menschen.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Dyschromasie-Applikation.py 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from PIL import Image, ImageTk
  2. import PIL
  3. import tkinter as tk
  4. from tkinter import filedialog, messagebox
  5. import cv2
  6. import numpy as np
  7. from Farbaenderung import gammaCorrection, reverseGammaCorrection
  8. from Scrollbar import ScrollFrame
  9. root = tk.Tk()
  10. simGrad = tk.IntVar(root)
  11. class Dyschromasie:
  12. cb_image = np.array([]).astype('float64')
  13. sim_image = np.array([]).astype('uint8')
  14. def __init__(self, img_mat=np.array([]), rows=0, cols=0, kanaele=0,sim_faktor=0, sim_kind='d'):
  15. self.rows = rows
  16. self.cols = cols
  17. self.kanaele = kanaele
  18. self.img_mat = img_mat
  19. self.sim_faktor = sim_faktor
  20. self.sim_kind = sim_kind
  21. T = np.array([[0.31399022, 0.63951294, 0.04649755],
  22. [0.15537241, 0.75789446, 0.08670142],
  23. [0.01775239, 0.10944209, 0.87256922]])
  24. T_reversed = np.array([[5.47221206, -4.6419601, 0.16963708],
  25. [-1.1252419, 2.29317094, -0.1678952],
  26. [0.02980165, -0.19318073, 1.16364789]])
  27. def Simulate(self):
  28. if self.sim_kind == 'p':
  29. sim_mat = np.array([[(1 - self.sim_faktor), 1.05118294 * self.sim_faktor, -0.05116099 * self.sim_faktor],
  30. [0, 1, 0],
  31. [0, 0, 1]])
  32. elif self.sim_kind == 'd':
  33. sim_mat = np.array([[1, 0, 0],
  34. [0.9513092 * self.sim_faktor, (1 - self.sim_faktor), 0.04866992 * self.sim_faktor],
  35. [0, 0, 1]])
  36. else:
  37. sim_mat = np.array([[1, 0, 0],
  38. [0, 1, 0],
  39. [-0.86744736 * self.sim_faktor, 1.86727089 * self.sim_faktor, (1 - self.sim_faktor)]])
  40. # Gammakorrektur durchfuehren
  41. self.cb_image = np.copy(self.img_mat).astype('float64')
  42. for i in range(self.rows):
  43. for j in range(self.cols):
  44. for x in range(3):
  45. self.cb_image[i, j, x] = gammaCorrection(self.img_mat[i, j, x])
  46. # Einzelne Pixelwertberechnung
  47. for i in range(self.rows):
  48. for j in range(self.cols):
  49. self.cb_image[i, j] = self.T_reversed.dot(sim_mat).dot(self.T).dot(self.cb_image[i, j])
  50. self.sim_image = np.copy(self.cb_image)
  51. self.sim_image = self.sim_image.astype('uint8')
  52. # Rücktransformation der Gammawerte
  53. for i in range(self.rows):
  54. for j in range(self.cols):
  55. for x in range(3):
  56. self.sim_image[i, j, x] = reverseGammaCorrection(self.cb_image[i, j, x])
  57. return self.sim_image
  58. root.title("Projekt Dyschromasie")
  59. SB = ScrollFrame(root)
  60. img = np.array([])
  61. rows = 0
  62. cols = 0
  63. kanaele = 0
  64. sim_pro = tk.IntVar(root)
  65. sim_deut = tk.IntVar(root)
  66. sim_tri = tk.IntVar(root)
  67. simulationsGradient = tk.Scale(SB.frame, from_=0, to_=100, variable=simGrad, orient='horizontal')
  68. simulationsGradient.grid(column= 0, row = 1, columnspan=10)
  69. def browse():
  70. # Auswahl des FilePaths
  71. try:
  72. path = tk.filedialog.askopenfilename(filetypes=[("Image File", '.jpg'),("Image File", '.png')])
  73. im = Image.open(path)
  74. except:
  75. tk.messagebox.showerror(title='Datenfehler', message='Kein Bild gefunden/ausgewählt')
  76. global simulateButton
  77. if len(path) > 0:
  78. simulateButton.config(state='active')
  79. # Anzeigen des Bildes
  80. tkimage = ImageTk.PhotoImage(im)
  81. myvar = tk.Label(SB.frame, image=tkimage)
  82. myvar.image = tkimage
  83. myvar.grid(columnspan=5)
  84. # Einspeichern der Path-Informationen
  85. global img, rows, cols, kanaele
  86. img = cv2.imread(path)
  87. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  88. #img = cv2.GaussianBlur(img, (3, 3), 0)
  89. rows, cols, kanaele = img.shape
  90. def simulate():
  91. global img, rows, cols, kanaele, sim_pro, sim_deut, sim_tri
  92. if sim_deut.get():
  93. d = Dyschromasie(img, rows, cols, kanaele, simGrad.get()/100, 'd')
  94. display_array_deut = np.copy(d.Simulate()).astype('uint8')
  95. T = tk.Text(SB.frame, height=1, width=15)
  96. T.grid(columnspan=5)
  97. print_string = "Deutranop(" + str(round(d.sim_faktor*100)) + "%)"
  98. T.insert('current', print_string)
  99. conv_SimulationPic_deut = ImageTk.PhotoImage(image=PIL.Image.fromarray(display_array_deut))
  100. sim_pic_deut = tk.Label(SB.frame, image=conv_SimulationPic_deut)
  101. sim_pic_deut.Image = conv_SimulationPic_deut
  102. sim_pic_deut.grid(columnspan=5)
  103. elif sim_tri.get():
  104. t = Dyschromasie(img, rows, cols, kanaele, simGrad.get()/100, 't')
  105. display_array_tri = np.copy(t.Simulate()).astype('uint8')
  106. T = tk.Text(SB.frame, height=1, width=15)
  107. T.grid(columnspan=5)
  108. print_string = "Tritanop(" + str(round(t.sim_faktor * 100)) + "%)"
  109. T.insert('current', print_string)
  110. conv_SimulationPic_tri = ImageTk.PhotoImage(image=PIL.Image.fromarray(display_array_tri))
  111. sim_pic_tri = tk.Label(SB.frame, image=conv_SimulationPic_tri)
  112. sim_pic_tri.Image = conv_SimulationPic_tri
  113. sim_pic_tri.grid(columnspan=5)
  114. elif sim_pro.get():
  115. p = Dyschromasie(img, rows, cols, kanaele, simGrad.get()/100, 'p')
  116. display_array_pro = np.copy(p.Simulate()).astype('uint8')
  117. T = tk.Text(SB.frame, height=1, width=15)
  118. T.grid(columnspan=5)
  119. print_string = "Protanop(" + str(round(p.sim_faktor * 100)) + "%)"
  120. T.insert('current', print_string)
  121. conv_SimulationPic_pro = ImageTk.PhotoImage(image=PIL.Image.fromarray(display_array_pro))
  122. sim_pic_pro = tk.Label(SB.frame, image=conv_SimulationPic_pro)
  123. sim_pic_pro.Image = conv_SimulationPic_pro
  124. sim_pic_pro.grid(columnspan=5)
  125. btn = tk.Button(SB.frame, text="Browse", width=25, command=browse, bg='light blue')
  126. btn.grid(column=0, row=0, columnspan=2)
  127. simulateButton = tk.Button(SB.frame, text="Simulate", width=25, command=simulate, bg='light blue')
  128. simulateButton.grid(column=1, row=0, columnspan=2)
  129. simulateButton.config(state='disabled')
  130. checkButton_p = tk.Checkbutton(SB.frame, text="Protanop", variable=sim_pro, onvalue=1, offvalue=0, height=5, width=20)
  131. checkButton_d = tk.Checkbutton(SB.frame, text="Deutanop", variable=sim_deut, onvalue=1, offvalue=0, height=5, width=20)
  132. checkButton_t = tk.Checkbutton(SB.frame, text="Tritanop", variable=sim_tri, onvalue=1, offvalue=0, height=5, width=20)
  133. checkButton_p.grid(column=0, row=2)
  134. checkButton_d.grid(column=1, row=2)
  135. checkButton_t.grid(column=2, row=2)
  136. SB.update()
  137. root.mainloop()