Как связать тензор изображения так, чтобы каждое значение пикселя было объединено / объединено в 1 из 10 значений в тензорном потоке - PullRequest
0 голосов
/ 30 июня 2019

У меня есть набор данных изображений в виде тензоров с каждым пикселем, имеющим значение от 0 до 1, и у меня есть набор "бинов".

bins = [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]

Я хочу вернуть тензор с каждым пикселемзначение, являющееся его ближайшей корзиной.Например, если пиксель равен 0,03, он превратится в 0,05, если пиксель равен 0,79, он превратится в 0,75.

Я хочу, чтобы это было сделано с тензорами, а не с нулевыми значениями.

Вот он, работает с тряпичным потоком, однако тензорный поток кажется совершенно другим зверем, когда дело доходит до итерации.Я пробовал tf.map_fn и tf.scan перебирать, но не смог заставить его работать.

def valueQuant(picture, splitSize):
  #This is the Picture that will be returned
  Quant_Pic = np.zeros((picture.shape[0], picture.shape[1]))

  #go through each pixel of the image
  for y_col in range(picture.shape[0]):  
    for x_row in range(picture.shape[1]):
      #isolate regions based on value
      for i in range(splitSize):
        #low and high values to isolate
        lowFloatRange = float((1/splitSize)*i)
        highFloatRange = float((1/splitSize)*(i+1))
        #value to turn entire clustor
        midRange = lowFloatRange + ((highFloatRange - lowFloatRange)/2)
        #current value of current pixel
        curVal = picture[y_col][x_row]
        #if the current value is within the range of interest
        if(curVal >= lowFloatRange and curVal <= highFloatRange):
            Quant_Pic[y_col][x_row] = midRange

  return Quant_Pic  

Мне удалось найти поэлементный метод, используя только методы тензорного потока.

def quant_val(current_input):
    bins = tf.constant([0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95])
    dist = tf.tile(current_input, [10])
    dist = tf.math.subtract(bins, current_input)
    absDist = tf.math.abs(dist)
    idx = tf.math.argmin(absDist)
    output = bins[idx]
    output = tf.expand_dims(output, 0)
    print("output", output)

    return output

current_input = tf.constant([0.53])
quant_val(current_input)

Это может вернуть правильный ответ для тензора с одним значением,но я не уверен, как экстраполировать это на большую структуру тензора изображения.Любая помощь приветствуется!!!Спасибо, добрые мудрые.

1 Ответ

0 голосов
/ 30 июня 2019

Круглый подход:

Это очень просто и легко, но некоторые значения .5 округляются вверх, другие - вниз. Если это не проблема:

def quant_val(images): #0 to 1

    images = (images - 0.05) * 10            #-0.5 to 9.5
    bins = tf.round(images)                  #0 to 9
    bins = tf.clip_by_value(bins, 0, 9)      #possible -1 and 10 due to the remark on top
    return (bins/10) + 0.05                  #0.05 to 0.95
...