Advertisement
mrAnderson33

КГ Лаба 2(2)

Mar 15th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.73 KB | None | 0 0
  1. from PIL import Image as IMG, ImageDraw,ImageTk
  2. from tkinter.filedialog import askopenfilename
  3. from tkinter import *
  4. import random, math, copy
  5.  
  6. def Laplassian(image, c, mode):
  7.     im = copy.copy(image)
  8.     draw = ImageDraw.Draw(im)  
  9.     pix = image.load()
  10.  
  11.     for i in range(1, width-1):
  12.         for j in range(1, height-1):
  13.             f = pix[i, j][0]
  14.             # if (f<135 and not mode):
  15.             #     print('yeah')
  16.             xn = pix[i+1, j][0]
  17.             xp = pix[i-1, j][0]
  18.             yn = pix[i, j+1][0]
  19.             yp = pix[i, j-1][0]
  20.             xnd = pix[i+1, j-1][0]
  21.             xpd = pix[i-1, j+1][0]
  22.             ynd = pix[i+1, j+1][0]
  23.             ypd = pix[i-1, j-1][0]
  24.             if (mode):
  25.                 lap = -(xn + xp + yn + yp )+(4 * f)
  26.             else:
  27.                 lap = -(xn + xp + yn + yp + xnd + ynd + xpd + ypd) + (8 * f)
  28.             if (lap<0):
  29.                 lap = 0
  30.             if ( lap>255):
  31.                 lap = 255
  32.             g = int(f + (c * lap))
  33.             if (g < 0):
  34.                 g = 0
  35.             if (g > 255):
  36.                 g = 255
  37.  
  38.             draw.point((i, j), (lap, lap, lap))
  39.  
  40.     return im
  41.  
  42. def Mask(image, size):
  43.     s = size//2
  44.     im = copy.copy(image)
  45.     draw = ImageDraw.Draw(im)  
  46.     pix = image.load()
  47.  
  48.     for i in range(0, width):
  49.         for j in range(0, height):
  50.             r = pix[i,j][0]
  51.             for w in range(-s, s):
  52.                 for h in range(-s, s):
  53.                     x = i+w
  54.                     z = j+h
  55.                     if (x < 0):
  56.                         x = 0
  57.                     if (x > width - 1):
  58.                         x = width - 1
  59.                     if (z < 0):
  60.                         z = 0
  61.                     if (z > height - 1):
  62.                         z = height - 1
  63.                     r += pix[x, z][0]
  64.  
  65.             r = r // (size ** 2)+(30-size)
  66.             if (r < 0):
  67.                 r = 0
  68.             if (r > 255):
  69.                 r = 255
  70.             draw.point((i, j), (r, r, r))
  71.  
  72.     return im
  73.  
  74. def Sobella (image):
  75.     im = copy.copy(image)
  76.     draw = ImageDraw.Draw(im)  
  77.     pix = image.load()
  78.  
  79.     for i in range(1, width-1):
  80.         for j in range(1, height-1):
  81.             # r_up = -pix[i-1, j+1][0] - 2 * pix[i, j+1][0] - pix[i+1, j+1][0]
  82.             # r_dwn = pix[i-1, j-1][0] + 2 * pix[i, j-1][0] + pix[i+1, j-1][0]
  83.             r_up = -pix[i-1, j+1][0] - 2 * pix[i-1, j][0] - pix[i-1, j-1][0]
  84.             r_dwn = pix[i+1, j+1][0] + 2 * pix[i+1, j][0] + pix[i+1, j-1][0]
  85.             r = (r_up + r_dwn)
  86.             if (r < 0):
  87.                 r = 0
  88.             if (r > 255):
  89.                 r = 255
  90.            
  91.             draw.point((i, j), (r, r, r))
  92.  
  93.     return im
  94.  
  95. def Gradation (image):
  96.     im = copy.copy(image)
  97.     draw = ImageDraw.Draw(im)  
  98.     pix = image.load()
  99.  
  100.     min = 255
  101.     max = 0
  102.     L = [[0] * height for i in range(width)]
  103.     for i in range(1, width-1):
  104.         for j in range(1, height-1):
  105.             f = pix[i, j][0]
  106.             # if (f<135 and not mode):
  107.             #     print('yeah')
  108.             xn = pix[i+1, j][0]
  109.             xp = pix[i-1, j][0]
  110.             yn = pix[i, j+1][0]
  111.             yp = pix[i, j-1][0]
  112.             xnd = pix[i+1, j-1][0]
  113.             xpd = pix[i-1, j+1][0]
  114.             ynd = pix[i+1, j+1][0]
  115.             ypd = pix[i-1, j-1][0]
  116.             lap = -(xn + xp + yn + yp + xnd + ynd + xpd + ypd) + (8 * f)
  117.  
  118.             if (lap<0):
  119.                 lap = 0
  120.             if ( lap>255):
  121.                 lap = 255
  122.             g = int(f + (0.5 * lap))
  123.  
  124.             if (g < 0):
  125.                 g = 0
  126.             if (g > 255):
  127.                 g = 255
  128.             # min / max for normalization image
  129.             if (g < min):
  130.                 min = g
  131.             if (g > max):
  132.                 max = g
  133.             L[i][j] = g
  134.  
  135.     for i in range(1, width-1):
  136.         for j in range(1, height-1):
  137.             # Normalize image
  138.             L[i][j] = int((L[i][j] - min) * (255 / max))
  139.             draw.point((i, j), (L[i][j], L[i][j], L[i][j]))
  140.  
  141.     return im
  142.  
  143. image = IMG.open(askopenfilename())  
  144.  
  145. split = image.filename.split("/")
  146. imagename = split[len(split)-1]
  147.  
  148. width = image.size[0]  
  149. height = image.size[1]  
  150. pix = image.load()
  151.  
  152. # make grey image
  153. draw = ImageDraw.Draw(image)
  154. for i in range(width):
  155.     for j in range(height):
  156.         a = pix[i, j][0]
  157.         b = pix[i, j][1]
  158.         c = pix[i, j][2]
  159.         # S = int(0.2989 * a + 0.5870 * b + 0.1140 * c)
  160.         S = int(a + b + c)//3
  161.         draw.point((i, j), (S, S, S))
  162.  
  163. # Laplassian
  164. laplassImage = Laplassian(image, 0.5, 0)
  165. # Sobella
  166. sobellaImage = Sobella(image)
  167. # Mask 5x5
  168. mask = Mask(image, 5)
  169. # Gradation
  170. gradation = Gradation(image)
  171.  
  172. images = [image,laplassImage,sobellaImage,mask,gradation]
  173.  
  174. root = Tk()
  175. #root.bind("<Button>", button_click_exit_mainloop)
  176. canvas = Canvas(root,width=999,height=999)
  177. canvas.pack()
  178. shape = (2,3)
  179. xlen,ylen = 0,0
  180. imgs = [x.resize((530,300)) for x in images]
  181. xsize = sum(im.size[0] for im in imgs)
  182. ysize = sum(im.size[1] for im in imgs)
  183. root.geometry('%dx%d' % (xsize,ysize))
  184. tkpi = [ImageTk.PhotoImage(im,master=canvas) for im in imgs]
  185. lbl = Label(root,text='Вторая лаба Задание №1', justify=LEFT)
  186. lbl.place(relx=.4, rely=.75)
  187. lbl.config(font=('times', 20, 'bold'))
  188.  
  189. for i in range(shape[0]):
  190.     for j in range(shape[1]):
  191.         index = i*shape[1]+j
  192.         if index == 5:
  193.             break
  194.         label_image = Label(root, image=tkpi[index])
  195.         label_image.place(x=xlen,y=ylen,width=imgs[index].size[0],height=imgs[index].size[1])
  196.         if j == shape[1]-1:
  197.             ylen = ylen + imgs[index].size[1]
  198.             xlen = 0
  199.         else:
  200.             xlen = xlen + imgs[index].size[0]
  201. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement