Advertisement
Guest User

sad

a guest
Apr 27th, 2016
674
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.24 KB | None | 0 0
  1. import sys
  2. from PySide.QtGui import *
  3. from PySide.QtCore import *
  4. from ui.MainWindow import Ui_MainWindow
  5. from HistogramsWindow import HistogramsWindow
  6. import os
  7. import matplotlib.pyplot as plotter
  8. from LUT import *
  9. from PIL import Image, ImageQt
  10. from MyImage import MyImage
  11.  
  12.  
  13. class MainWindow(QMainWindow, Ui_MainWindow):
  14. def __init__(self):
  15. super(MainWindow, self).__init__()
  16. self.setupUi(self)
  17. self.show()
  18. self.scene_orig = QGraphicsScene()
  19. self.img_orig_view.setScene(self.scene_orig)
  20. self.scene_preview = QGraphicsScene()
  21. self.img_preview_view.setScene(self.scene_preview)
  22.  
  23. self.img_orig = MyImage()
  24. self.img_preview = MyImage()
  25.  
  26. self.histograms = HistogramsWindow()
  27.  
  28. self.actionOpenImage.clicked.connect(self.open_image)
  29. self.actionSave.triggered.connect(self.save_image)
  30. self.actionOpenHistograms.triggered.connect(self.open_histograms)
  31. self.actionOpenBrightnessWindow.triggered.connect(self.set_brightness_handler)
  32. self.actionOpenEqualizationWindow.triggered.connect(self.histogram_equalization_handler)
  33. self.actionOpenStretchingWindow.triggered.connect(self.histogram_stretch_handler)
  34. self.actionOpenCustomBinarization.triggered.connect(self.custom_binarization_handler)
  35. self.actionOpenOtsuBinarization.triggered.connect(self.otsu_binarization_handler)
  36. # self.actionOpenNiblackBinarization.triggered.connect(self.niblack_binarization_handler)
  37.  
  38. def open_image(self):
  39. path, _ = QFileDialog.getOpenFileName()
  40. img = Image.open(path)
  41. self.refresh_image_view(img, self.img_orig, self.scene_orig, self.img_orig_view)
  42. self.refresh_image_view(img, self.img_preview, self.scene_preview, self.img_preview_view)
  43.  
  44. def save_image(self):
  45. path, _ = QFileDialog.getSaveFileName()
  46. self.img_preview.img.save(path)
  47.  
  48. def open_histograms(self):
  49. self.refresh_histograms(self.img_preview.img)
  50.  
  51. def set_brightness_handler(self):
  52. text, ok = QInputDialog.getInt(self, 'Input Dialog', 'b:')
  53. if ok:
  54. b = int(text)
  55. lut = getBrightnessLUT(b)
  56. img_prev = Image.eval(self.img_orig.img, applyLUT(lut))
  57. self.refresh_image_view(img_prev, self.img_preview, self.scene_preview, self.img_preview_view)
  58.  
  59. def histogram_equalization_handler(self):
  60. if self.img_orig.img.mode in ('RGB', 'RGBA'):
  61. r, g, b = self.img_orig.img.split()
  62. r = r.point(getEqualizationLUT(r.histogram()))
  63. g = g.point(getEqualizationLUT(g.histogram()))
  64. b = b.point(getEqualizationLUT(b.histogram()))
  65. img_prev = Image.merge('RGB', (r, g, b))
  66. else:
  67. img_prev = self.img_orig.img.copy()
  68. img_prev = img_prev.point(getEqualizationLUT(img_prev.histogram()))
  69. self.refresh_image_view(img_prev, self.img_preview, self.scene_preview, self.img_preview_view)
  70.  
  71. def histogram_stretch_handler(self):
  72. text_a, ok_a = QInputDialog.getInt(self, 'Input Dialog', 'a:')
  73. text_b, ok_b = QInputDialog.getInt(self, 'Input Dialog', 'b:')
  74. if ok_a and ok_b:
  75. extrema = (int(text_a), int(text_b))
  76. else:
  77. extrema = None
  78.  
  79. if self.img_orig.img.mode in ('RGB', 'RGBA'):
  80. r, g, b = self.img_orig.img.split()
  81. r = r.point(getStretchLUT(r, extrema))
  82. g = g.point(getStretchLUT(g, extrema))
  83. b = b.point(getStretchLUT(b, extrema))
  84. img_prev = Image.merge('RGB', (r, g, b))
  85. else:
  86. img_prev = self.img_orig.img.copy()
  87. img_prev = img_prev.point(getStretchLUT(img_prev, extrema))
  88. self.refresh_image_view(img_prev, self.img_preview, self.scene_preview, self.img_preview_view)
  89.  
  90. def binarize(self, treshold):
  91. img_prev = self.img_orig.img.convert('L')
  92. img_prev = img_prev.point(getBinarizationLUT(treshold))
  93. self.refresh_image_view(img_prev, self.img_preview, self.scene_preview, self.img_preview_view)
  94.  
  95. def custom_binarization_handler(self):
  96. text, ok = QInputDialog.getInt(self, 'Input Dialog', 'Prog:')
  97. if ok:
  98. self.binarize(int(text))
  99.  
  100. def otsu_binarization_handler(self):
  101. prev_img = self.img_orig.img.convert('L')
  102. bits = prev_img.getdata()
  103. n = len(bits) / 4
  104. hist = 256 * [0]
  105. for i in range(0, len(bits), 4):
  106. hist[bits[i]] += 1
  107. s = sum(hist[i] * i for i in range(256))
  108. w = maximum = threshold = s0 = 0
  109. for i in range(256):
  110. w += hist[i]
  111. if n == w:
  112. break
  113. if w != 0:
  114. s0 += i * hist[i]
  115. between = (s0 * n - s * w) ** 2 / w / (n - w)
  116. if between > maximum:
  117. threshold = i
  118. maximum = between
  119. print threshold
  120. self.binarize(threshold)
  121.  
  122. # def niblack_binarization_handler(self):
  123. # img = self.img_orig.img.copy()
  124. # text, ok = QInputDialog.getInt(self, 'Input Dialog', 'rozmiar:')
  125. # size = int(text)
  126. # text, ok = QInputDialog.getDouble(self, 'Input Dialog', 'k:')
  127. # k = float(text)
  128. # colors = list(img.getdata())[::4]
  129. # print colors
  130. # w, h = img.size
  131. # thresholds = len(colors) * [0]
  132. # for i in range(len(colors)):
  133. # x, y = i % w, i // w
  134. # x0, y0 = x - size // 2, y - size // 2
  135. # block = []
  136. # for y1 in range(y0, y0 + size):
  137. # for x1 in range(x0, x0 + size):
  138. # if 0 <= x1 < w and 0 <= y1 < h:
  139. # block.append(y1 * w + x1)
  140. # block = list(map(lambda a: colors[a], block))
  141. # m = sum(block) / len(block)
  142. # d = (sum(map(lambda a: (a - m) ** 2, block)) / len(block)) ** 0.5
  143. # thresholds[i] = int(m + k * d)
  144. # bits = img.bits()
  145. # for i, v in enumerate(thresholds):
  146. # c = 0 if colors[i] <= v else 255
  147. # bits[4 * i] = c
  148. # bits[4 * i + 1] = c
  149. # bits[4 * i + 2] = c
  150. # img.putdata(bits)
  151. #
  152. # self.refresh_image_view(img, self.img_preview, self.scene_preview, self.img_preview_view)
  153.  
  154. def refresh_image_view(self, img, my_image, scene, view):
  155. my_image.img = img
  156. print img.mode
  157. my_image.data = data = img.convert('RGBA').tobytes('raw', 'RGBA')
  158. my_image.qt = img_qt = QImage(data, img.size[0], img.size[1], QImage.Format_ARGB32)
  159. my_image.pixmap = QPixmap.fromImage(img_qt)
  160. scene.clear()
  161. view.update()
  162. view.setTransform(QTransform())
  163. scene.addPixmap(my_image.pixmap)
  164.  
  165. def refresh_histograms(self, image):
  166. plotter.clf()
  167. if image.mode in ('RGB', 'RGBA'):
  168. names = ('red', 'green', 'blue', 'avg')
  169. hist = tuple(band.getdata() for band in image.split())
  170. paths = tuple((os.path.join(os.path.dirname(__file__), 'tmp', name + '.png') for name in names))
  171. for counter, data in enumerate(tuple(zip(paths[:3], hist))):
  172. plotter.subplot(2, 2, counter + 1)
  173. plotter.hist(data[1], bins=255)
  174. plotter.ylabel(names[counter])
  175. plotter.xlim((0, 255))
  176. # plotter.savefig(data[0], dpi=50)
  177. # plotter.clf()
  178.  
  179. avg_hist = tuple(int((r + g + b) / 3) for r, g, b in zip(*hist))
  180. plotter.subplot(2, 2, counter + 2)
  181. plotter.hist(avg_hist, bins=255)
  182. plotter.ylabel('avg')
  183. plotter.xlim((0, 255))
  184. # plotter.savefig(paths[3], dpi=50)
  185. # plotter.clf()
  186. plotter.show()
  187. else:
  188. hist = image.split()[0].getdata()
  189. path = os.path.join(os.path.dirname(__file__), 'tmp', 'gray.png')
  190. plotter.hist(hist)
  191. plotter.ylabel('gray')
  192. plotter.xlim((0, 255))
  193. # plotter.savefig(path, dpi=50)
  194. plotter.show()
  195.  
  196.  
  197. if __name__ == '__main__':
  198. app = QApplication(sys.argv)
  199. mainWin = MainWindow()
  200.  
  201. ret = app.exec_()
  202. sys.exit(ret)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement