Advertisement
Paarzivall

Untitled

Jan 4th, 2019
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.74 KB | None | 0 0
  1. from skimage import data, img_as_float, img_as_ubyte
  2. from skimage import io, img_as_ubyte, exposure, util, morphology
  3. from skimage.color import rgb2gray, rgb2hsv
  4. import matplotlib.pyplot as plt
  5. import cv2
  6. import numpy as np
  7. import random
  8.  
  9. def show2imgs(im1, im2, title1='Obraz pierwszy', title2='Obraz drugi', size=(10,10)):
  10.    
  11.     import matplotlib.pyplot as plt
  12.    
  13.     f, (ax1, ax2) = plt.subplots(1,2, figsize=size)
  14.     ax1.imshow(im1, cmap='gray')
  15.     ax1.axis('off')
  16.     ax1.set_title(title1)
  17.  
  18.     ax2.imshow(im2, cmap='gray')
  19.     ax2.axis('off')
  20.     ax2.set_title(title2)
  21.     plt.show()
  22.  
  23. #Segmentacja i scalanie obiektów
  24. def segmentuj(img):
  25.     for i in range(img.shape[0]-4):
  26.         for j in range(img.shape[1]-4):
  27.             if img[i][j] != 255.0:
  28.                 if img[i][j] == 0.0:
  29.                     img[i][j] = random.randint(1, 250)
  30.                     if img[i-1][j-1] != 0.0 and img[i-1][j-1] != 255.0:
  31.                         img[i][j] = img[i-1][j-1]
  32.                     elif img[i-1][j] != 0.0 and img[i-1][j] != 255.0:
  33.                         img[i][j] = img[i-1][j]
  34.                     elif img[i-1][j+1] != 0.0 and img[i-1][j+1] != 255.0:
  35.                         img[i][j] = img[i-1][j+1]
  36.                     elif img[i][j-1] != 0.0 and img[i][j-1] != 255.0:
  37.                         img[i][j] = img[i][j-1]
  38.                     elif img[i][j+1] != 0.0 and img[i][j+1] != 255.0:
  39.                         img[i][j] = img[i][j+1]
  40.                     elif img[i+1][j-1] != 0.0 and img[i+1][j-1] != 255.0:
  41.                         img[i][j] = img[i-1][j-1]
  42.                     elif img[i+1][j] != 0.0 and img[i+1][j] != 255.0:
  43.                         img[i][j] = img[i+1][j]
  44.                     elif img[i+1][j+1] != 0.0 and img[i+1][j+1] != 255.0:
  45.                         img[i][j] = img[i+1][j+1]
  46.                     else:
  47.                         continue
  48.                     #scalanie obiektów
  49.                 if img[i][j] != img[i-1][j-1] and img[i-1][j-1] != 255.0:
  50.                     img[i][j] = img[i-1][j-1]
  51.                    
  52.                 elif img[i][j] != img[i-1][j] and img[i-1][j] != 255.0:
  53.                     img[i][j] = img[i-1][j]
  54.                    
  55.                 elif img[i][j] != img[i-1][j+1] and img[i-1][j+1] != 255.0:
  56.                     img[i-1][j+1] = img[i][j]
  57.                    
  58.                 elif img[i][j] != img[i][j-1] and img[i][j-1] != 255.0:
  59.                     img[i][j-1] = img[i][j]
  60.                    
  61.                 elif img[i][j] != img[i][j+1] and img[i][j+1] != 255.0:
  62.                     img[i][j+1] = img[i][j]
  63.                    
  64.                 elif img[i][j] != img[i+1][j-1] and img[i+1][j-1] != 255.0:
  65.                     img[i][j] = img[i+1][j-1]
  66.                    
  67.                 elif img[i][j] != img[i+1][j] and img[i+1][j] != 255.0:
  68.                     img[i][j] = img[i+1][j]
  69.                 elif img[i][j] != img[i+1][j+1] and img[i+1][j+1] != 255.0:
  70.                     img[i][j] = img[i+1][j+1]
  71.                 else:
  72.                     continue
  73.     return img
  74.  
  75.  
  76. def scal(img):
  77.     for i in range(img.shape[0]-4):
  78.         for j in range(img.shape[1]-4):  
  79.             if img[i][j] != img[i-1][j-1] and img[i-1][j-1] != 255:
  80.                 img[i][j] = img[i-1][j-1]
  81.  
  82.             elif img[i][j] != img[i-1][j] and img[i-1][j] != 255:
  83.                 img[i][j] = img[i-1][j]
  84.  
  85.             elif img[i][j] != img[i-1][j+1] and img[i-1][j+1] != 255:
  86.                 img[i-1][j+1] = img[i][j]
  87.  
  88.             elif img[i][j] != img[i][j-1] and img[i][j-1] != 255:
  89.                 img[i][j-1] = img[i][j]
  90.  
  91.             elif img[i][j] != img[i][j+1] and img[i][j+1] != 255:
  92.                 img[i][j+1] = img[i][j]
  93.  
  94.             elif img[i][j] != img[i+1][j-1] and img[i+1][j-1] != 255:
  95.                 img[i][j] = img[i+1][j-1]
  96.  
  97.             elif img[i][j] != img[i+1][j] and img[i+1][j] != 255:
  98.                 img[i][j] = img[i+1][j]
  99.             elif img[i][j] != img[i+1][j+1] and img[i+1][j+1] != 255:
  100.                 img[i][j] = img[i+1][j+1]
  101.             else:
  102.                 continue
  103.                
  104.     return img
  105.  
  106.  
  107. im = io.imread('przeskalowane/0.09v2.jpg')
  108.  
  109. plt.figure(figsize=(15,10))
  110. plt.imshow(im, cmap="gray")
  111. plt.axis('off')
  112. plt.show()
  113.  
  114. th = 150
  115. img = img_as_ubyte(rgb2gray(im))
  116. plt.imshow(img, cmap="gray")
  117. plt.axis('on')
  118. plt.show()
  119.  
  120. th, bimm = cv2.threshold(img, thresh=th, maxval=255, type=cv2.THRESH_OTSU)
  121. mbim = cv2.medianBlur(bimm,  11)
  122. plt.imshow(mbim, cmap="gray")
  123. plt.axis('on')
  124. plt.show()
  125.  
  126. dt = cv2.distanceTransform(mbim, distanceType=cv2.DIST_L2, maskSize=cv2.DIST_MASK_PRECISE)
  127.  
  128. th = 45
  129. th, bim = cv2.threshold(dt, thresh=th, maxval=255, type=cv2.THRESH_BINARY_INV)
  130. show2imgs(bim, dt, title1='Obraz po binaryzacji', title2='Obraz po transformacie odległościowej', size=(25,25))
  131.  
  132. kernel = np.ones((3,3),np.uint8)
  133. erodeBin = cv2.erode(bim, kernel=kernel, iterations=25)
  134.  
  135. plt.imshow(erodeBin, cmap="hot")
  136. plt.axis('on')
  137. plt.show()
  138.  
  139.  
  140. #Liczenie ilości obiektów na obrazie
  141. def licz_obiekty(img):
  142.     ile_obiektow = 0
  143.     obiekty = []
  144.     for i in range(img.shape[0]):
  145.         for j in range(img.shape[1]):
  146.             if img[i][j] != 255:
  147.                 obiekty.append(img[i][j])
  148.     ile_obiektow = len(list(set(obiekty)))# zlicza niepowtarzające się elementy listy
  149.     return ile_obiektow
  150.  
  151.  
  152. nimg = segmentuj(bim)
  153. tmp = 0
  154. ile = licz_obiekty(nimg)
  155. print(ile)
  156. while tmp != ile:
  157.     print(tmp)
  158.     nimg = scal(nimg)
  159.     nimg = scal(nimg)
  160.     tmp = ile
  161.     ile = licz_obiekty(nimg)
  162.     print("Wykonało się!")
  163.  
  164. plt.imshow(nimg, cmap="hot")
  165. plt.axis('on')
  166. plt.show()
  167.  
  168. ile_ob = ile
  169.  
  170. print("Obiektów jest:\t", ile_ob)
  171.  
  172.  
  173.  
  174. #od tego momentu próby zliczenia ich nominałów
  175. nimg = erodeBin = cv2.erode(bim, kernel=kernel, iterations=48)
  176. mbim = cv2.medianBlur(bimm,  9)
  177. dist =  cv2.distanceTransform(mbim, cv2.DIST_L1 , 5)
  178. im2, contours, hierarchy = cv2.findContours(mbim, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  179. cv2.drawContours(nimg, contours, -1, (0,0,0), 7)
  180. #show2imgs(mbim, nimg, title1='Obraz po binaryzacji', title2='Obraz po transformacie odległościowej', size=(25,25))
  181.  
  182. plt.imshow(nimg, cmap="gray")
  183. plt.axis('on')
  184. plt.show()
  185. print(contours)
  186.  
  187. kolory = []
  188. jakie_obiekty = []
  189. for i in range(nimg.shape[0]):
  190.     for j in range(nimg.shape[1]):
  191.         if nimg[i][j] != 0:
  192.             if nimg[i][j] != 255:
  193.                 kolory.append(nimg[i][j])
  194. jakie_obiekty = list(set(kolory))
  195. print(jakie_obiekty)
  196.  
  197. pola_nowe = {}
  198. for x in jakie_obiekty:
  199.     ile_pikseli = 0
  200.     for i in range(nimg.shape[0]):
  201.         for j in range(nimg.shape[1]):
  202.             if nimg[i][j] == x:
  203.                 ile_pikseli += 1
  204.     pola_nowe[x] = ile_pikseli
  205.    
  206. for i in pola_nowe:
  207.     print(i, pola_nowe[i])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement