def __getOnePictureRegion(self,img): ''' get region of the picture return: the boundingbox list of the image and it save as ((xmin,ymin),(xmax,ymax)) ''' if img!=None: h_cof = float(img.shape[0])/self.height w_cof = float(img.shape[1])/self.width #resize the img to standard scale img = cv.resize(img,(self.height,self.width)) #blur the image to remove the noise img = cv.GaussianBlur(img,(5,5),0.8,0.8,0) #get the edge set of the image e_set = [] for i in range(0,self.height): for j in range(0,self.width): ij_edge=[] if j<self.width-1: similar = abs(img.item(i,j)-img.item(i,j+1)) ij_edge.append((i*self.width+j+1,similar)) if i<self.height-1: similar = abs(img.item(i,j)-img.item(i+1,j)) ij_edge.append(((i+1)*self.width+j,similar)) if j<self.width-1 and i<self.height-1: similar = abs(img.item(i,j)-img.item(i+1,j+1)) ij_edge.append(((i+1)*self.width+(j+1),similar)) e_set.append(ij_edge) #do segment img_seg = segmentor.grap_base_seg(e_set,self.k) #return result in boundingbox list bbs = {} for i in range(0,len(img_seg)): raw = i//self.width column = i-raw*self.width region = disjoin_set.find(img_seg[i]) if bbs.has_key(region): if bbs[region][0] > column: bbs[region][0] = column if bbs[region][2] < column: bbs[region][2] = column if bbs[region][1] > raw: bbs[region][1] = raw if bbs[region][3] < raw: bbs[region][3] = raw else: bbs[region] = [column,raw,column,raw] regions = [] filter_size = self.height*self.width*self.thresh for key in bbs: if (bbs[key][2]-bbs[key][0])\ *(bbs[key][3]-bbs[key][1])>=filter_size: regions.append( [int(bbs[key][0]*w_cof),\ int(bbs[key][1]*h_cof),\ int(bbs[key][2]*w_cof),\ int(bbs[key][3]*h_cof)] ) return regions
def main(data): forest = [] for item in data: forest.append(node(item)) disjoin_set.union(forest[1],forest[2]) disjoin_set.union(forest[3],forest[4]) disjoin_set.union(forest[1],forest[4]) for item in forest: if item==disjoin_set.find(item): print "item is:"+str(item)+" value is:"+str(item.value)+" parent is:"+str(item.parent)
def grap_base_seg(e_set,k): ''' Here we will implimention the graph based iamge segment method which proposed by Pedro F.Felzenszwalb and Daniel P.Huttenlocher in the paper "Efficient Graph-Based Image Segmentation" This method based on Kruskal's algorithm and use the disjoin set as the data structure The interpretation of arguments: e_set : is the list of edge's weight, and it saved in a symmetric matrix. And the index is the position of pixel which ordered by column first, raw second.As the matrix will be very sparse, so here use link chain to store k : is the coefficent multiplier The result will stored in the disjoin set ''' #Zero: order the edge in e_set by weight in Ascending order ord_e = [] for i in range(0,len(e_set)): for j in range(0,len(e_set[i])): ord_e.append(edge_node(i,e_set[i][j][0],e_set[i][j][1])) ord_e.sort(cmp_e) #First: initialize the segment,v_set will maintains the result v_set = [] for raw in range(0,len(e_set)): v_set.append(vertex_node(0)) #Second, split loop, for each edge do the follow for e in ord_e: region1 = disjoin_set.find(v_set[e.v1]) region2 = disjoin_set.find(v_set[e.v2]) if region1!=region2: Int1 = region1.value + k/region1.coefficient Int2 = region2.value + k/region2.coefficient Int = Int1 if Int1 > Int2: Int = Int2 if e.w <= Int: #then the two region can be merged region = disjoin_set.union(region1,region2) region.value = e.w #the max w in MST of region region.coefficient = region1.coefficient + region2.coefficient else: continue #Third, return the result return v_set
def grap_base_seg(e_set, k): """ Here we will implimention the graph based iamge segment method which proposed by Pedro F.Felzenszwalb and Daniel P.Huttenlocher in the paper "Efficient Graph-Based Image Segmentation" This method based on Kruskal's algorithm and use the disjoin set as the data structure The interpretation of arguments: e_set : is the list of edge's weight, and it saved in a symmetric matrix. And the index is the position of pixel which ordered by column first, raw second.As the matrix will be very sparse, so here use link chain to store k : is the coefficent multiplier The result will stored in the disjoin set """ # Zero: order the edge in e_set by weight in Ascending order ord_e = [] for i in range(0, len(e_set)): for j in range(0, len(e_set[i])): ord_e.append(edge_node(i, e_set[i][j][0], e_set[i][j][1])) ord_e.sort(cmp_e) # First: initialize the segment,v_set will maintains the result v_set = [] for raw in range(0, len(e_set)): v_set.append(vertex_node(0)) # Second, split loop, for each edge do the follow for e in ord_e: region1 = disjoin_set.find(v_set[e.v1]) region2 = disjoin_set.find(v_set[e.v2]) if region1 != region2: Int1 = region1.value + k / region1.coefficient Int2 = region2.value + k / region2.coefficient Int = Int1 if Int1 > Int2: Int = Int2 if e.w <= Int: # then the two region can be merged region = disjoin_set.union(region1, region2) region.value = e.w # the max w in MST of region region.coefficient = region1.coefficient + region2.coefficient else: continue # Third, return the result return v_set
def main(data): forest = [] for item in data: forest.append(node(item)) disjoin_set.union(forest[1], forest[2]) disjoin_set.union(forest[3], forest[4]) disjoin_set.union(forest[1], forest[4]) for item in forest: if item == disjoin_set.find(item): print "item is:" + str(item) + " value is:" + str( item.value) + " parent is:" + str(item.parent)
def initial_set(img, initial_regions, bins, similar_coef, similar_set, region_set, bb_set): width = img.shape[1] height = img.shape[0] img_size = img.size for i in range(0, len(initial_regions)): pixel = (i // width, i - (i // width) * width) color = img[pixel[0], pixel[1]] region = disjoin_set.find(initial_regions[i]) if region_set.has_key(region): region_set[region].add_p(pixel, color) else: region_set[region] = region_node() region_set[region].add_p(pixel, color) for region in region_set: his = region_similar.histogram(region_set[region].region_value, bins) region_set[region].colour_his = his / his.sum() bb_set.append(region_set[region].bounding_box) for i in range(0, len(initial_regions)): raw = i // width column = i - raw * width if column < width - 1: j = i + 1 region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1 != region2: selective_search.make_pair(img_size, similar_set, region_set, similar_coef, region1, region2) if raw < height - 1: j = (raw + 1) * width + column region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1 != region2: selective_search.make_pair(img_size, similar_set, region_set, similar_coef, region1, region2) if raw < height - 1 and column < width - 1: j = (raw + 1) * width + (column + 1) region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1 != region2: selective_search.make_pair(img_size, similar_set, region_set, similar_coef, region1, region2)
def main(img_path, thresh): #load the image raw_img = cv.imread(img_path) img = cv.cvtColor(raw_img, cv.COLOR_RGB2GRAY) #use gray image if img == None: sys.stderr.write("error happened in Loading img!") return cv.namedWindow('image', cv.WINDOW_NORMAL) # create a can resize window cv.imshow('image', img) #draw image in window named "image" cv.waitKey(0) #until a key stroke, it will continue #resize the iamge img = cv.resize(img, (128, 128)) raw_img = cv.resize(raw_img, (128, 128)) #blur to remove the noise img = cv.GaussianBlur(img, (5, 5), 0.8, 0.8, 0) #Get the edge set of the image e_set = [] height = img.shape[0] width = img.shape[1] for i in range(0, height): for j in range(0, width): ij_edge = [] if j < width - 1: similar = abs(img.item(i, j) - img.item(i, j + 1)) #similar = pixel_similar.normalize_dif((i,j),(i,j+1),img,5) ij_edge.append((i * width + j + 1, similar)) if i < height - 1: similar = abs(img.item(i, j) - img.item(i + 1, j)) #similar = pixel_similar.normalize_dif((i,j),(i+1,j),img,5) ij_edge.append(((i + 1) * width + j, similar)) if j < width - 1 and i < height - 1: similar = abs(img.item(i, j) - img.item(i + 1, j + 1)) #similar = pixel_similar.normalize_dif((i,j),(i+1,j+1),img,5) ij_edge.append(((i + 1) * width + (j + 1), similar)) e_set.append(ij_edge) print "The number of vertex is: " + str(len(e_set)) #do segment k = 350 #(which is good for image with size: 128*128) img_seg = segmentor.grap_base_seg(e_set, k) print len(img_seg) count = 0 for item in img_seg: if item == item.parent: count += 1 print "region number is: " + str(count) #draw the result regions = {} ''' for i in range(0,len(img_seg)): raw = i//width column = i-(raw*width) region = disjoin_set.find(img_seg[i]) if regions.has_key(region): if regions[region][0]>raw: regions[region][0]=raw elif regions[region][1]<raw: regions[region][1] = raw else: pass if regions[region][2]>column: regions[region][2] = column elif regions[region][3]<column: regions[region][3] = column else: pass else: regions[region]=[raw,raw,column,column] ''' for i in range(0, len(img_seg)): raw = i // width column = i - (raw * width) region = disjoin_set.find(img_seg[i]) if regions.has_key(region): regions[region].append((raw, column)) else: regions[region] = [(raw, column)] pixel_num = 0 for region in regions: color = [ random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) ] pixel_num += len(regions[region]) if len(regions[region]) > thresh: for p in regions[region]: raw_img[p[0], p[1]] = color print "The number of pixel in region is: " + str(pixel_num) cv.imshow('res', raw_img) cv.waitKey(0) cv.destroyAllWindows() '''
def initial_set(img,initial_regions,bins,similar_coef,similar_set,region_set,bb_set): width = img.shape[1] height = img.shape[0] img_size = img.size for i in range(0,len(initial_regions)): pixel = (i//width,i-(i//width)*width) color = img[pixel[0],pixel[1]] region = disjoin_set.find(initial_regions[i]) if region_set.has_key(region): region_set[region].add_p(pixel,color) else: region_set[region] = region_node() region_set[region].add_p(pixel,color) for region in region_set: his = region_similar.histogram( region_set[region].region_value, bins) region_set[region].colour_his = his/his.sum() bb_set.append(region_set[region].bounding_box) for i in range(0,len(initial_regions)): raw = i//width column = i-raw*width if column < width-1: j = i+1 region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1!=region2: selective_search.make_pair( img_size, similar_set, region_set, similar_coef, region1, region2 ) if raw < height-1: j = (raw+1)*width+column region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1!=region2: selective_search.make_pair( img_size, similar_set, region_set, similar_coef, region1, region2 ) if raw < height-1 and column < width-1: j = (raw+1)*width+(column+1) region1 = disjoin_set.find(initial_regions[i]) region2 = disjoin_set.find(initial_regions[j]) if region1!=region2: selective_search.make_pair( img_size, similar_set, region_set, similar_coef, region1, region2 )
def __getOnePictureRegion(self, img): ''' get region of the picture return: the boundingbox list of the image and it save as ((xmin,ymin),(xmax,ymax)) ''' if img != None: h_cof = float(img.shape[0]) / self.height w_cof = float(img.shape[1]) / self.width #resize the img to standard scale img = cv.resize(img, (self.height, self.width)) #blur the image to remove the noise img = cv.GaussianBlur(img, (5, 5), 0.8, 0.8, 0) #get the edge set of the image e_set = [] for i in range(0, self.height): for j in range(0, self.width): ij_edge = [] if j < self.width - 1: similar = abs(img.item(i, j) - img.item(i, j + 1)) ij_edge.append((i * self.width + j + 1, similar)) if i < self.height - 1: similar = abs(img.item(i, j) - img.item(i + 1, j)) ij_edge.append(((i + 1) * self.width + j, similar)) if j < self.width - 1 and i < self.height - 1: similar = abs(img.item(i, j) - img.item(i + 1, j + 1)) ij_edge.append( ((i + 1) * self.width + (j + 1), similar)) e_set.append(ij_edge) #do segment img_seg = segmentor.grap_base_seg(e_set, self.k) #return result in boundingbox list bbs = {} for i in range(0, len(img_seg)): raw = i // self.width column = i - raw * self.width region = disjoin_set.find(img_seg[i]) if bbs.has_key(region): if bbs[region][0] > column: bbs[region][0] = column if bbs[region][2] < column: bbs[region][2] = column if bbs[region][1] > raw: bbs[region][1] = raw if bbs[region][3] < raw: bbs[region][3] = raw else: bbs[region] = [column, raw, column, raw] regions = [] filter_size = self.height * self.width * self.thresh for key in bbs: if (bbs[key][2]-bbs[key][0])\ *(bbs[key][3]-bbs[key][1])>=filter_size: regions.append( [int(bbs[key][0]*w_cof),\ int(bbs[key][1]*h_cof),\ int(bbs[key][2]*w_cof),\ int(bbs[key][3]*h_cof)] ) return regions
def main(img_path,thresh): #load the image raw_img = cv.imread(img_path) img = cv.cvtColor(raw_img,cv.COLOR_RGB2GRAY) #use gray image if img==None: sys.stderr.write("error happened in Loading img!") return cv.namedWindow('image',cv.WINDOW_NORMAL) # create a can resize window cv.imshow('image',img) #draw image in window named "image" cv.waitKey(0) #until a key stroke, it will continue #resize the iamge img = cv.resize(img,(128,128)) raw_img = cv.resize(raw_img,(128,128)) #blur to remove the noise img = cv.GaussianBlur(img,(5,5),0.8,0.8,0) #Get the edge set of the image e_set=[] height = img.shape[0] width = img.shape[1] for i in range(0,height): for j in range(0,width): ij_edge=[] if j<width-1: similar = abs(img.item(i,j)-img.item(i,j+1)) #similar = pixel_similar.normalize_dif((i,j),(i,j+1),img,5) ij_edge.append((i*width+j+1,similar)) if i<height-1: similar = abs(img.item(i,j)-img.item(i+1,j)) #similar = pixel_similar.normalize_dif((i,j),(i+1,j),img,5) ij_edge.append(((i+1)*width+j,similar)) if j<width-1 and i<height-1: similar = abs(img.item(i,j)-img.item(i+1,j+1)) #similar = pixel_similar.normalize_dif((i,j),(i+1,j+1),img,5) ij_edge.append(((i+1)*width+(j+1),similar)) e_set.append(ij_edge) print "The number of vertex is: "+str(len(e_set)) #do segment k=350 #(which is good for image with size: 128*128) img_seg = segmentor.grap_base_seg(e_set,k) print len(img_seg) count=0 for item in img_seg: if item == item.parent: count+=1 print "region number is: "+str(count) #draw the result regions = {} ''' for i in range(0,len(img_seg)): raw = i//width column = i-(raw*width) region = disjoin_set.find(img_seg[i]) if regions.has_key(region): if regions[region][0]>raw: regions[region][0]=raw elif regions[region][1]<raw: regions[region][1] = raw else: pass if regions[region][2]>column: regions[region][2] = column elif regions[region][3]<column: regions[region][3] = column else: pass else: regions[region]=[raw,raw,column,column] ''' for i in range(0,len(img_seg)): raw = i//width column = i-(raw*width) region = disjoin_set.find(img_seg[i]) if regions.has_key(region): regions[region].append((raw,column)) else: regions[region]=[(raw,column)] pixel_num = 0 for region in regions: color=[random.randint(0,255),random.randint(0,255),random.randint(0,255)] pixel_num += len(regions[region]) if len(regions[region]) > thresh: for p in regions[region]: raw_img[p[0],p[1]] = color print "The number of pixel in region is: "+str(pixel_num) cv.imshow('res',raw_img) cv.waitKey(0) cv.destroyAllWindows() '''