PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/ass1/task.py

https://github.com/GoSteven/9517
Python | 253 lines | 186 code | 27 blank | 40 comment | 58 complexity | a314ed61dd9fc647bf8422b1e8bd93e2 MD5 | raw file
  1. #!/usr/bin/python
  2. #===============================================================================
  3. #
  4. # FILE: task.py
  5. #
  6. # USAGE: ./task.py
  7. #
  8. # DESCRIPTION: The Assignment 1 of COMP9517
  9. #
  10. # OPTIONS: ---
  11. # REQUIREMENTS: ---
  12. # BUGS: ---
  13. # NOTES: ---
  14. # AUTHOR: Steven(Silin) YOU, steven@gosteven.com
  15. # COMPANY: (on my own)
  16. # VERSION: 1.0
  17. # CREATED: 08/09/2011 14:00:31
  18. # REVISION: ---
  19. #===============================================================================
  20. import cv2.cv as cv
  21. import os
  22. import sys
  23. import glob
  24. import math
  25. class Image:
  26. def __init__(self,param):
  27. self.ori = cv.LoadImage(param)
  28. self.img = cv.LoadImage(param)
  29. self.blrImg = cv.LoadImage(param)
  30. self.maxlable = 0
  31. #blur img
  32. cv.Smooth(self.img,self.blrImg,cv.CV_MEDIAN,5,5)
  33. #global lable
  34. self.lable = cv.CreateImage(cv.GetSize(self.img),8,1)
  35. cv.Set(self.lable,0)
  36. cv.Threshold(self.img,self.img,100,255,cv.CV_THRESH_BINARY)
  37. cv.Threshold(self.blrImg,self.blrImg,80,255,cv.CV_THRESH_BINARY)
  38. self.grey = cv.CreateImage(cv.GetSize(self.ori),8,1)
  39. self.mask = cv.CreateImage(cv.GetSize(self.blrImg),8,1)
  40. cv.CvtColor(self.ori,self.grey,cv.CV_BGR2GRAY)
  41. cv.CvtColor(self.blrImg,self.mask,cv.CV_BGR2GRAY)
  42. def calculateMeanAndVariance(self,ori,mask):
  43. backGroundSum = 0
  44. foreGroundSum = 0
  45. backGroundCount = 0
  46. foreGroundCount = 0
  47. #calculate mean
  48. for i in range(ori.width):
  49. for j in range(ori.height):
  50. if (mask[j,i] == 255):
  51. foreGroundSum += ori[j,i] + 0
  52. foreGroundCount += 1
  53. else:
  54. backGroundSum += ori[j,i] + 0
  55. backGroundCount += 1
  56. backGroundMean = backGroundSum / backGroundCount
  57. foreGroundMean = foreGroundSum / foreGroundCount
  58. print "mean: background", backGroundMean, "foreGround", foreGroundMean
  59. meanString1 = "mean: "
  60. meanString2 = "background" + str(backGroundMean)
  61. meanString3 = "foreGround" + str(foreGroundMean)
  62. #calculate variance
  63. varBackGroundSum = 0
  64. varForeGroundSum = 0
  65. for i in range(ori.width):
  66. for j in range(ori.height):
  67. if (mask[j,i] == 255):
  68. varForeGroundSum += math.pow(foreGroundMean - ori[j,i], 2)
  69. else:
  70. varBackGroundSum += math.pow(backGroundMean - ori[j,i], 2)
  71. varBackGround = varBackGroundSum / backGroundCount
  72. varForeGround = varForeGroundSum / foreGroundCount
  73. print "variance: background", varBackGround, "foreGround", varForeGround
  74. varString1 = "variance: "
  75. varString2 = "background" + str(varBackGround)
  76. varString3 = "foreGround" + str(varForeGround)
  77. font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 0.3, 0.3, 0, 1, 8)
  78. # cv.PutText(self.ori,meanString1,(20,20),font,cv.Scalar(200, 200, 20))
  79. # cv.PutText(self.ori,meanString2,(20,30),font,cv.Scalar(200, 200, 20))
  80. # cv.PutText(self.ori,meanString3,(20,40),font,cv.Scalar(200, 200, 20))
  81. # cv.PutText(self.ori,varString1,(20,50),font,cv.Scalar(200, 200, 20))
  82. # cv.PutText(self.ori,varString2,(20,60),font,cv.Scalar(200, 200, 20))
  83. # cv.PutText(self.ori,varString3,(20,70),font,cv.Scalar(200, 200, 20))
  84. def iterateNeibor(self,img,j,i):
  85. if (i>=0 and i<img.width and j>=0 and j<img.height and img[j,i] == 255):
  86. self.lableNeibor(img, j, i)
  87. def lableNeibor(self,img,j,i):
  88. if (self.lable[j,i] > 0):
  89. return
  90. self.lable[j,i] = self.maxlable
  91. self.iterateNeibor(img, j+1, i)
  92. self.iterateNeibor(img, j, i+1)
  93. self.iterateNeibor(img, j, i-1)
  94. self.iterateNeibor(img, j-1, i)
  95. def lableimg(self,src):
  96. grey = cv.CreateImage(cv.GetSize(src),8,1)
  97. cv.CvtColor(src,grey,cv.CV_BGR2GRAY)
  98. self.removeWhiteLine(grey)
  99. for i in range(grey.width):
  100. for j in range(grey.height):
  101. if (grey[j,i] == 255 and self.lable[j,i] == 0):
  102. self.maxlable = self.maxlable+1
  103. self.lableNeibor(grey,j,i)
  104. def incr_item(self,dict, key):
  105. try:
  106. item = dict[key]
  107. except KeyError:
  108. item = 0
  109. dict[key] = item + 1
  110. def findMostCommonLable(self,grey,masklable):
  111. countLable = {}
  112. for i in range(grey.width):
  113. for j in range(grey.height):
  114. if (masklable[j,i]>0 and self.lable[j,i] == 255):
  115. self.incr_item(countLable,masklable[j,i])
  116. # for w in sorted(countLable, key=countLable.get, reverse=True):
  117. # print w,countLable[w]
  118. for w in sorted(countLable, key=countLable.get, reverse=True):
  119. if (w>0):
  120. return w
  121. def setLevel(self,level):
  122. for i in range(self.lable.width):
  123. for j in range(self.lable.height):
  124. if (self.lable[j,i] == 255):
  125. if (level == None):
  126. self.lable[j,i] = 244
  127. else:
  128. self.lable[j,i] = level
  129. def lableimgBasedOnMask(self,src,masklable):
  130. grey = cv.CreateImage(cv.GetSize(src),8,1)
  131. cv.CvtColor(src,grey,cv.CV_BGR2GRAY)
  132. self.removeWhiteLine(grey)
  133. for i in range(grey.width):
  134. for j in range(grey.height):
  135. if (grey[j,i] == 255 and self.lable[j,i] == 0):
  136. self.maxlable = 255
  137. self.lableNeibor(grey,j,i)
  138. # cv.ShowImage("afterLable2",self.lable)
  139. # cv.WaitKey(0)
  140. level = self.findMostCommonLable(grey, masklable)
  141. print "level", level
  142. if (~ (level ==None)):
  143. self.findCenterAndLablePlus(self.lable,level,255)
  144. self.setLevel(level)
  145. def findCenterAndLablePlus(self,lable,level,targetlevel):
  146. sumWidth = 0
  147. sumHeight = 0
  148. count = 0
  149. for i in range(self.lable.width):
  150. for j in range(self.lable.height):
  151. if (self.lable[j,i] == targetlevel):
  152. sumWidth += i
  153. sumHeight += j
  154. count += 1
  155. if (count < 8):
  156. return
  157. meanWidth = sumWidth / count
  158. meanHeight = sumHeight / count
  159. font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 0.3, 0.3, 0, 1, 8)
  160. try:
  161. level = float(level)
  162. cv.PutText(self.ori,str(int(level)),(meanWidth,meanHeight),font,cv.Scalar(10, 200, 200))
  163. except TypeError:
  164. level = 0.5
  165. def findCenterAndLable(self,lable,level):
  166. sumWidth = 0
  167. sumHeight = 0
  168. count = 0
  169. for i in range(self.lable.width):
  170. for j in range(self.lable.height):
  171. if (self.lable[j,i] == level):
  172. sumWidth += i
  173. sumHeight += j
  174. count += 1
  175. if (count < 10):
  176. return
  177. meanWidth = sumWidth / count
  178. meanHeight = sumHeight / count
  179. font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 0.3, 0.3, 0, 1, 8)
  180. cv.PutText(self.ori,str(level),(meanWidth,meanHeight),font,cv.Scalar(10, 200, 200))
  181. # cv.PutText(self.blrImg,str(level),(meanHeight,meanWidth),font,cv.Scalar(10, 200, 200))
  182. def removeWhiteLine(self,img):
  183. for i in range(6):
  184. count = 0
  185. for j in range(img.height):
  186. img[j,i] = 0
  187. if (img[j,i] == 255):
  188. count += 1
  189. if (count > self.lable.height*3/4):
  190. for j in range(img.height):
  191. img[j,i] = 0
  192. sys.setrecursionlimit(100000)
  193. isShowImg = 1
  194. path = 'data/'
  195. prePic = None
  196. #for infile in glob.glob(os.path.join(path,'*.jpg')):
  197. # imagefile = infile
  198. #for num in range(70,139):
  199. # imagefile = path + "v3_" + str(num) + ".jpg"
  200. for num in range(1,5):
  201. imagefile = "testdata/test_" + str(num) + ".jpg"
  202. infile = imagefile
  203. print "----read image file----"
  204. print infile
  205. pic = Image(imagefile)
  206. outputFileName = os.path.basename(imagefile)
  207. if (prePic == None or isShowImg == 1):
  208. pic.lableimg(pic.blrImg)
  209. #calculate mean and variance
  210. pic.calculateMeanAndVariance(pic.grey, pic.mask)
  211. for i in range(1, pic.maxlable):
  212. pic.findCenterAndLable(pic.lable,i)
  213. if (isShowImg == 1):
  214. cv.ShowImage("afterLable",pic.ori)
  215. cv.ShowImage("blrthrlab",pic.blrImg)
  216. cv.WaitKey(0)
  217. cv.SaveImage("outimg/_"+outputFileName, pic.ori)
  218. cv.SaveImage("outimg/0_"+outputFileName, pic.blrImg)
  219. prePic = pic
  220. else:
  221. pic.lableimgBasedOnMask(pic.blrImg,prePic.lable)
  222. cv.SaveImage("outimg/_"+outputFileName, pic.ori)
  223. if (isShowImg == 1):
  224. cv.ShowImage("afterLable2",prePic.ori)
  225. cv.WaitKey(0)
  226. # cv.WaitKey(0)