Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
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()
    '''
Ejemplo n.º 8
0
 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
                         )
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
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()

    '''