scale_test.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/usr/bin/env python
  2. # -*- coding=utf-8 -*-
  3. # coding=utf-8
  4. import sys
  5. reload(sys)
  6. sys.setdefaultencoding('utf8')
  7. import os
  8. import numpy as np
  9. import cv2
  10. import time
  11. from log import *
  12. from skimage import measure, color
  13. def get_image_box2(img,lower_color,upper_color,img_width,median=3):
  14. img_hsv = cv2.inRange(cv2.cvtColor(img,cv2.COLOR_BGR2HSV), lower_color, upper_color)
  15. img_hsv=cv2.medianBlur(img_hsv, median)
  16. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (median, median))
  17. img_hsv = cv2.dilate(img_hsv, kernel)
  18. img_hsv = cv2.erode(img_hsv, kernel)
  19. min_length=15
  20. # labels = measure.label(img_hsv)
  21. # props = measure.regionprop(labels)
  22. # bbox=None
  23. # for ia in range(len(props)):
  24. # if props[ia].bbox[3]-props[ia].bbox[1]<img_width/4 and props[ia].bbox[3]-props[ia].bbox[1]>min_length and (bbox is None or props[ia].bbox[3]-props[ia].bbox[1]>bbox[3]-bbox[1] ):
  25. # #print("props[ia].bbox:",props[ia].bbox," ",props[ia].bbox[3]-props[ia].bbox[1])
  26. # bbox=props[ia].bbox
  27. # if not bbox is None:
  28. # cv2.rectangle(img_hsv,(props[ia].bbox[1],props[ia].bbox[0]),(props[ia].bbox[3],props[ia].bbox[2]),(255,255,255),2)
  29. if lower_color[2]==0:
  30. cv2.imwrite(r"e:\b2\hsv4.jpg",img_hsv)
  31. edgeThresh =70
  32. img2 = cv2.Canny(img_hsv,edgeThresh,edgeThresh*3,apertureSize =3)
  33. if lower_color[2]==0:
  34. cv2.imwrite(r"e:\b2\canny.jpg",img2)
  35. lines=cv2.HoughLinesP(img_hsv, 1, np.pi/180, 120,None,min_length,median)
  36. if not lines is None:
  37. cv2.imwrite(r"e:\b2\img2"+str(lower_color[2])+".jpg",img2)
  38. maxline=None
  39. max_verticals=[]
  40. for line in lines:
  41. x1, y1, x2, y2=line[0]
  42. if x2==x1 and abs(y1-y2)>min_length*2:
  43. if len(max_verticals)<2:
  44. max_verticals.append((x1,y1,x2,y2))
  45. # cv2.line(img_hsv, (x1, y2-50), (x2,y1+50), (255, 255, 255), 5)
  46. else:
  47. for index in range(len(max_verticals)):
  48. if abs(y1-y2)>abs(max_verticals[index][1]-max_verticals[index][3]):
  49. max_verticals[index]=(x1,y1,x2,y2)
  50. break
  51. offset=3
  52. # print("max_verticals:",max_verticals)
  53. for line in lines:
  54. x1, y1, x2, y2=line[0]
  55. print("line[0]:[",lower_color[2],"]",line[0])
  56. cv2.line(img_hsv, (x1, y1), (x2, y2), (125, 124, 124), 5)
  57. cv2.imwrite(r"e:\b2\hsv"+str(lower_color[2])+".jpg",img_hsv)
  58. if x2-x1>min_length and (maxline==None or x2-x1>maxline[2]-maxline[0]):
  59. # cv2.line(img_hsv, (x1-50, y1+3), (x2+50, y2+3), (255, 255, 255), 2)
  60. # cv2.imwrite(r"e:\b2\hsv"+str(lower_color[2])+".jpg",img_hsv)
  61. if len(max_verticals)==0 :
  62. maxline=(x1,y1,x2,y2)
  63. else:
  64. is_offset=False
  65. for index in range(len(max_verticals)):
  66. if abs(max_verticals[index][0]-x1)<=offset or abs(max_verticals[index][2]-x2)<=offset:
  67. is_offset=True
  68. break
  69. if not is_offset:
  70. maxline=(x1,y1,x2,y2)
  71. return maxline
  72. else:
  73. return None
  74. def get_image_box(img,lower_color,upper_color,img_width,median=3):
  75. img_hsv = cv2.inRange(cv2.cvtColor(img,cv2.COLOR_BGR2HSV), lower_color, upper_color)
  76. img_hsv=cv2.medianBlur(img_hsv, median)
  77. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (median, median))
  78. img_hsv = cv2.dilate(img_hsv, kernel)
  79. img_hsv = cv2.erode(img_hsv, kernel)
  80. min_length=15
  81. edgeThresh =70
  82. img2 = cv2.Canny(img_hsv,edgeThresh,edgeThresh*3,apertureSize =3)
  83. # if lower_color[2]==0:
  84. # cv2.imwrite(r"e:\b2\canny.jpg",img2)
  85. contours, hierarchy= cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  86. max_rect=None
  87. for i in range(len(contours)):
  88. rect=cv2.boundingRect(contours[i])
  89. if rect[2]>min_length and (max_rect==None or rect[2]>max_rect[2]):
  90. max_rect=rect
  91. if not max_rect is None:
  92. for i in range(len(contours)):
  93. rect=cv2.boundingRect(contours[i])
  94. if is_in_rect(rect,max_rect):
  95. if rect[2]>max_rect[2]/2:
  96. max_rect=rect
  97. #print("max_rect:",max_rect)
  98. offset=4
  99. return max_rect if max_rect is None else (max_rect[0]+offset,max_rect[1]+max_rect[3],max_rect[0]+max_rect[2]-offset,max_rect[1]+max_rect[3])
  100. def is_in_rect(rect_small,rect_large):
  101. return rect_small[0]>rect_large[0] and rect_small[0]+rect_small[2]<rect_large[0]+rect_large[2] and rect_small[1]>rect_large[1] and rect_small[1]+rect_small[3]<rect_large[1]+rect_large[3]
  102. def get_scale_rect(img,deep_height=300):
  103. height=img.shape[0]
  104. width=img.shape[1]
  105. print("width:",width,", height:",height)
  106. #color
  107. color_tuples=[
  108. #red
  109. (np.array([0, 127, 128]) ,np.array([10, 255, 255]),5),
  110. #green
  111. (np.array([60, 76, 46]) ,np.array([100, 255, 255]),5)]
  112. black_tuples=[
  113. #black
  114. (np.array([0, 0, 0]) ,np.array([180, 255, 46]),1)
  115. #white
  116. ,(np.array([0, 0, 221]) ,np.array([180, 30, 255]),3)
  117. ]
  118. banner_imgs=[img[height-deep_height:,]
  119. ,img[:deep_height,]
  120. ]
  121. deeps=[height-deep_height,0]
  122. for color_tuple in color_tuples:
  123. i=0
  124. for banner_img in banner_imgs:
  125. bbox=get_image_box(banner_img,color_tuple[0],color_tuple[1],width,color_tuple[2])
  126. if not bbox is None:
  127. #print("banner_img:",banner_img,", color_tuple:",color_tuple)
  128. return (bbox[0],bbox[1],bbox[2],bbox[3],deeps[i])
  129. i+=1
  130. scale=None
  131. for color_tuple in black_tuples:
  132. i=0
  133. for banner_img in banner_imgs:
  134. bbox=get_image_box(banner_img,color_tuple[0],color_tuple[1],width,color_tuple[2])
  135. if not bbox is None:
  136. # if not scale is None:
  137. # print("scale: bbox[2]:", bbox[2],", bbox[0]:",bbox[0],", scale[2]:",scale[2],",scale[0],",scale[0],", bbox[2]-bbox[0]:",bbox[2]-bbox[0],", scale[2]-scale[0]:",scale[2]-scale[0])
  138. if scale is None or bbox[2]-bbox[0]>scale[2]-scale[0]:
  139. #print("black bbox:",bbox,", ",bbox[2]-bbox[0],", deep:",deeps[i],", color_tuple:",color_tuple)
  140. scale= (bbox[0],bbox[1],bbox[2],bbox[3],deeps[i])
  141. return scale
  142. i+=1
  143. return scale
  144. def get_scale(img):
  145. scale=get_scale_rect(img)
  146. return 0 if scale is None else scale[2]-scale[0]
  147. def test():
  148. jpg_file=r"e:\b2\M_B-Other-C-500X-2019121601_23b0f2d2.jpg"
  149. jpg_file=r"e:\b2\55MnB.jpg"
  150. jpg_file=r"e:\b2\20200617160856.jpg"
  151. jpg_file=r"e:\b2\03116102_A2.jpg"
  152. jpg_file=r"e:\b2\20#rz.jpg"
  153. jpg_file=r"e:\b2\20200515140955.jpg"
  154. jpg_file=r"e:\b2\6587a18d99434adb9dd1b5350bc52fd.jpg"
  155. jpg_file=r"e:\b2\20200617161139.jpg"
  156. jpg_file=r"e:\b2\4341.JPG"
  157. jpg_file=r"e:\b2\SNAP-111916-0055.jpg"
  158. jpg_file=r"e:\b2\3_100X.jpg"
  159. jpg_file=r"e:\b2\W_200X.jpg"
  160. jpg_file=r"e:\b2\1x500.jpg"
  161. ##jpg_file=r"e:\b2\30CrMoA500.jpg"
  162. #jpg_file=r"e:\b2\100-2.JPG"
  163. #jpg_file=r"e:\b2\625100X.JPG"
  164. #jpg_file=r"e:\b2\1000X-5.jpg"
  165. #jpg_file=unicode(r"E:\ibm\样品收集\照片\20200709\各类图片\轴承钢碳化物网状 带状\碳化物网状500x.JPG")
  166. imgcolor=cv2.imdecode(np.fromfile(jpg_file, dtype=np.uint8),1)
  167. maxrect=get_scale_rect(imgcolor)
  168. height=imgcolor.shape[0]
  169. width=imgcolor.shape[1]
  170. if maxrect:
  171. cv2.line(imgcolor, (maxrect[0], maxrect[3]+maxrect[4]), (maxrect[2], maxrect[3]+maxrect[4]), (255, 0, 0), 5)
  172. cv2.namedWindow("enhanced",0)
  173. cv2.resizeWindow("enhanced",width/2,height/2)
  174. cv2.imshow("enhanced",imgcolor)
  175. cv2.waitKey(0)
  176. if __name__ == '__main__':
  177. start = time.time()
  178. log_info("scale test start...")
  179. if len(sys.argv)<2:
  180. log_error("missing parameter")
  181. sys.exit()
  182. jpg_file=sys.argv[1].decode('gbk');
  183. img=cv2.imdecode(np.fromfile(jpg_file, dtype=np.uint8), 1)
  184. log_info("jpg_file:"+jpg_file)
  185. length=get_scale(img)
  186. log_result(length)
  187. log_info("{0} scale length finished, result:{1} consume:{2}".format(jpg_file,length,str(time.time()-start)))