Advertisement
999ms

captcha filter vers 1

Apr 1st, 2020
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.92 KB | None | 0 0
  1. from PIL import Image, ImageFilter
  2. from collections import deque
  3.  
  4. class DSU_2D:
  5.     d = [[]]
  6.     p = [[]]
  7.     def __init__(self, n, m):
  8.         self.d = [[1 for _ in range(m)] for __ in range(n)]
  9.         self.p = [[(i, j) for j in range(m)] for i in range(n)]
  10.    
  11.     def get(self, x, y):
  12.         if self.p[x][y] == (x, y):
  13.             return (x, y)
  14.         self.p[x][y] = self.get(self.p[x][y][0], self.p[x][y][1])
  15.         return self.p[x][y]
  16.    
  17.     def uni(self, a, b):
  18.         a = self.get(a[0], a[1])
  19.         b = self.get(b[0], b[1])
  20.         if a == b:
  21.             return False
  22.         if self.d[a[0]][a[1]] < self.d[b[0]][b[1]]:
  23.             a, b = b, a
  24.         self.p[b[0]][b[1]] = a
  25.         self.d[a[0]][a[1]] += self.d[b[0]][b[1]]
  26.         return True
  27.  
  28.  
  29. white = (255, 255, 255)
  30. black = (0, 0, 0)
  31.    
  32. def Filter(num):
  33.     name = 'C:\\Users\\bossb\\Desktop\\for_Andrew\\  (' + str(num) + ').png'
  34.     try:  
  35.         tmp = Image.open(name)  
  36.     except FileNotFoundError:  
  37.         return False
  38.    
  39.     def get_image(name):
  40.         image = Image.open(name).convert('RGB')
  41.         pixel_map = image.load()
  42.         return image, pixel_map, image.size[0], image.size[1]
  43.    
  44.     image, pixel_map, w, h = get_image(name)
  45.  
  46.     def distance(a, b, coefs):
  47.         ans = 0
  48.         for i in range(3):
  49.             ans += abs(a[i] - b[i]) * coefs[i];
  50.         return ans
  51.    
  52.     def reverse():
  53.         for x in range(w):
  54.             for y in range(h):
  55.                 r, g, b = pixel_max[x, y]
  56.                 pixel_map[x, y] = 255 - r, 255 - g, 255 - b
  57.    
  58.     def generate_steps(dlt, flag):
  59.         if flag:
  60.             return [(i, j) for i in range(-dlt, dlt + 1) for j in range(-dlt, dlt + 1)]  
  61.         return [(i, j) for i in range(-dlt, dlt + 1) for j in range(-dlt, dlt + 1) if not (i == 0 and j == 0)]
  62.    
  63.     def connect(steps, border, coefs):
  64.         dsu = DSU_2D(w, h)
  65.        
  66.         for x in range(w):
  67.             for y in range(h):
  68.                 for (dx, dy) in steps:
  69.                     nx = x + dx
  70.                     ny = y + dy
  71.                     if nx < 0 or ny < 0 or nx >= w or ny >= h:
  72.                         continue
  73.                     if distance(pixel_map[x, y], pixel_map[nx, ny], coefs) <= border:
  74.                         dsu.uni((x, y), (nx, ny))
  75.         return dsu
  76.    
  77.     def drawing_rule(pixel_map, w, h):
  78.         gray = (200, 200, 200)
  79.         for x in range(w):
  80.             up = 0
  81.             down = 0
  82.             for y in range(h):
  83.                 if pixel_map[x, y] == black:
  84.                     down += 1
  85.             for y in range(h):
  86.                 if pixel_map[x, y] == black:
  87.                     up += 1
  88.                     down -= 1
  89.                 if up > 0 and down > 0:
  90.                     pixel_map[x, y] = gray
  91.         for x in range(w):
  92.             for y in range(h):
  93.                 if pixel_map[x, y] == gray:
  94.                     pixel_map[x, y] = black
  95.    
  96.    
  97.     def find_start_point():
  98.         for x in range(w):
  99.             for y in range(h):
  100.                 if distance(white, pixel_map[x, y], [1.0, 1.0, 1.0]) >= 100:
  101.                     return (x, y)
  102.         return (w - 1, h - 1)
  103.    
  104.     def kill_grad():
  105.         q = deque()
  106.         q.append(find_start_point())
  107.         used = [[False for j in range(h)] for i in range(w)]
  108.         used[0][0] = True
  109.         steps = generate_steps(1, False)
  110.         while len(q):
  111.             x, y = q.popleft()
  112.             for (dx, dy) in steps:
  113.                 nx = x + dx
  114.                 ny = y + dy
  115.                 if nx < 0 or ny < 0 or nx >= w or ny >= h or used[nx][ny]:
  116.                     continue
  117.                 if distance(pixel_map[x, y], pixel_map[nx, ny], [1.0, 1.0, 1.0]) <= 7:
  118.                     used[nx][ny] = True
  119.                     q.append((nx, ny))
  120.         for x in range(w):
  121.             for y in range(h):
  122.                 if used[x][y]:
  123.                     pixel_map[x, y] = white
  124.    
  125.     kill_grad()
  126.    
  127.     for x in range(w):
  128.         for y in range(h):
  129.             if pixel_map[x, y] != white:
  130.                 pixel_map[x, y] = black
  131.    
  132.     steps = generate_steps(1, True)
  133.     dsu = connect(steps, 0, [1, 1, 1])
  134.     mp = [[0 for j in range(h)] for i in range(w)]
  135.    
  136.     for x in range(w):
  137.         for y in range(h):
  138.             if dsu.get(x, y) != (x, y):
  139.                 continue
  140.             color = int(255.0 * dsu.d[x][y] / w / h)
  141.             if color > 100:
  142.                 color = white
  143.             else:
  144.                 color = black
  145.             if dsu.d[x][y] <= 3:
  146.                 color = white
  147.             mp[x][y] = color
  148.            
  149.     for x in range(w):
  150.         for y in range(h):
  151.             a, b = dsu.get(x, y)
  152.             pixel_map[x, y] = mp[a][b]
  153.    
  154.    
  155.     image2, pixel_map2, w, h = get_image(name)
  156.     drawing_rule(pixel_map, w, h)
  157.    
  158.     for x in range(w):
  159.         for y in range(h):
  160.             if pixel_map[x, y] == white:
  161.                 pixel_map2[x, y] = white
  162.        
  163.     steps = generate_steps(1, False)
  164.     mp = {}
  165.    
  166.     for x in range(w):
  167.         for y in range(h):
  168.             good = False
  169.             for (dx, dy) in steps:
  170.                 nx = x + dx
  171.                 ny = y + dy
  172.                 if nx < 0 or ny < 0 or nx >= w or ny >= h:
  173.                     continue
  174.                 if pixel_map2[nx, ny] == white and pixel_map2[x, y] != white:
  175.                     good = True
  176.                     break
  177.             if good:
  178.                 if pixel_map2[x, y] not in mp:
  179.                     mp[pixel_map2[x, y]] = 0
  180.                 mp[pixel_map2[x, y]] += 1
  181.    
  182.     mx = 0
  183.     clr = white
  184.     border = 10
  185.     coefs = [1.0, 1.0, 1.0]
  186.    
  187.     for val in mp:
  188.         cur = 0
  189.         for val2 in mp:
  190.             if distance(val, val2, coefs) <= border:
  191.                 cur += mp[val2]
  192.         if mx < cur:
  193.             mx = cur
  194.             clr = val
  195.  
  196.     for x in range(w):
  197.         for y in range(h):
  198.             if distance(pixel_map2[x, y], clr, [1.0, 1.0, 1.0]) <= 50:
  199.                 pixel_map2[x, y] = black
  200.    
  201.     def Func():
  202.         mp = {}
  203.         for x in range(w):
  204.             for y in range(h):
  205.                 c = pixel_map2[x, y]
  206.                 if c == black or c == white:
  207.                     continue
  208.                 if c not in mp:
  209.                     mp[c] = 0
  210.                 mp[c] += 1
  211.  
  212.         clr = white
  213.         mx = 0
  214.         for val in mp:
  215.             if mp[val] > mx:
  216.                 mx = mp[val]
  217.                 clr = val
  218.  
  219.         for x in range(w):
  220.             for y in range(h):
  221.                 if distance(pixel_map2[x, y], clr, [1.0, 1.0, 1.0]) <= 100:
  222.                     pixel_map2[x, y] = white
  223.    
  224.     Func()
  225.    
  226.     for x in range(w):
  227.         for y in range(h):
  228.             if pixel_map2[x, y] != black:
  229.                 pixel_map2[x, y] = white
  230.    
  231.     image2.show()
  232.     return True
  233.    
  234.  
  235. for num in range(50):
  236.     Filter(num)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement