简体   繁体   中英

How to find the closest pixel points indexes of one RGB list from another RGB list?

I have been working for some Image Processing Task. I have provided all details what I want to do below.

What I intend to do:

I have two lists

colorlist = around 500 rgb values (From picture 1 which I already have)

color = around 1200 or more RGB values (From picture 2 which I have also)

Note: Above lists can vary their size like colorlist can be sometimes bigger than color

Now I want to find all the elements of color to get its closest pixel values in colorlist then return the closest pixel values in a form of list [suppose list_1 ] and finally return the indexes of that list [ list_1 ] from Picture 2 whole Image RGB List.

For Example:

picture2 = 
[[ 59 218 186]
 [161 144 250]
 [133 165 249]
 [135 125 125]
 ...
 [59  58 145]
 [153  144 155]
 [ 61 225  87]
 [153 149  63]]

colorlist = 

[[ 59 218 186]
 [161 144 250]
 [133 165 249]
 ...
 [155  58 184]
 [ 61 225  87]
 [153 149  63]]

color = 

[[201 224 194]
 [121  93 158]
 [ 99 143 153]
 ...
 [193  67 171]
 [ 80  49  94]
 [125 121 219]]


#Suppose these two values are closest found  in color array from colorlist
list1 = [(161, 144, 250), (133, 165, 249) ] 



index = [2 , 3] #Found from picture2 whole image array

###the index here is assumed for demonstration it can be larger or different from colorlist





What I tried:

Method 1: Using numpy linalg norm

def closest_points(color,colorlist):
  for x in range (0, len(color):
    dist = np.linalg.norm(colorlist - color[x], axis=1)
    tmp = colorlist[np.argmin(dist)]
    list1.append(tmp)
  return list1

ERROR THROWS: Same as Method 2 (Dimension Error)

Method 2: Using Scipy KDTree

def closest_points(color,colorlist):
  for x in range (0, len(color):
    tree = sp.KDTree(colorlist)
    tmp = colorlist[tree.query(color[x])[1]]
    list1.append(tmp)
  return list1

ERROR THROWS:

super().__init__(data, leafsize, compact_nodes, copy_data,
File "_ckdtree.pyx", line 560, in scipy.spatial._ckdtree.cKDTree.__init__
ValueError: data must be 2 dimensions


Method 3:

def closest_points(rgb,newlist):
    r, g, b = rgb
    color_diffs = []
    for x in newlist:
        cr, cg, cb = x
        color_diff = math.sqrt((r - cr)**2 + (g - cg)**2 + (b - cb)**2)
        color_diffs.append((color_diff, x))
    return min(color_diffs)[1]

for x in range (0, len(color)):
    
    tmp = closest_color(color[x],colorlist)
    list1.append(tmp)

ERROR THROWS:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Hope my question is clear. Thanks for the help !

I found the solution of it by myself. In method 2 there is no need to iterate.

def closest_points(color,colorlist): 
  tree = sp.KDTree(colorlist)
  tmp = colorlist[tree.query(color)[1]]
return tmp

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM