【问题标题】:how does image rotation work in this function图像旋转在这个函数中是如何工作的
【发布时间】:2021-04-29 20:39:40
【问题描述】:

我无法理解从#LIST DEST PIXEL INDICES 开始的代码,我不明白为什么 and x 和 y 它们就是这样,为什么它们不是从 0,0 而不是 DIM//2 开始。据我了解,此函数通过“逆”转换目标像素并将原始像素插入目标像素位置来转换图像。

get_mat(*args) 返回一个进行各种变换的 3x3 矩阵,假设它是一个旋转矩阵 取 IMAGE_SIZE[0] 为 224

这是 Chris Deotte Kaggel 笔记本的一部分 https://www.kaggle.com/cdeotte/rotation-augmentation-gpu-tpu-0-96

def transform(image,label):
    # input image - is one image of size [dim,dim,3] not a batch of [b,dim,dim,3]
    # output - image randomly rotated, sheared, zoomed, and shifted
    DIM = IMAGE_SIZE[0]
    XDIM = DIM%2 #fix for size 331
    
    rot = 15. * tf.random.normal([1],dtype='float32')
    shr = 5. * tf.random.normal([1],dtype='float32') 
    h_zoom = 1.0 + tf.random.normal([1],dtype='float32')/10.
    w_zoom = 1.0 + tf.random.normal([1],dtype='float32')/10.
    h_shift = 16. * tf.random.normal([1],dtype='float32') 
    w_shift = 16. * tf.random.normal([1],dtype='float32') 
  
    # GET TRANSFORMATION MATRIX
    m = get_mat(rot,shr,h_zoom,w_zoom,h_shift,w_shift) 

    # LIST DESTINATION PIXEL INDICES
    x = tf.repeat( tf.range(DIM//2,-DIM//2,-1), DIM )
    y = tf.tile( tf.range(-DIM//2,DIM//2),[DIM] )
    z = tf.ones([DIM*DIM],dtype='int32')
    idx = tf.stack( [x,y,z] )
    
    # ROTATE DESTINATION PIXELS ONTO ORIGIN PIXELS
    idx2 = K.dot(m,tf.cast(idx,dtype='float32'))
    idx2 = K.cast(idx2,dtype='int32')
    idx2 = K.clip(idx2,-DIM//2+XDIM+1,DIM//2)
    
    # FIND ORIGIN PIXEL VALUES           
    idx3 = tf.stack( [DIM//2-idx2[0,], DIM//2-1+idx2[1,]] )
    d = tf.gather_nd(image,tf.transpose(idx3))
        
    return tf.reshape(d,[DIM,DIM,3]),label

【问题讨论】:

    标签: python image tensorflow machine-learning kaggle


    【解决方案1】:

    这看起来像是以简单的方式完成的图像仿射变换(没有多重采样),即为所有目标像素在源数组中找到对应的像素并取其值。

    目标像素坐标被放入一个列表idx,它是用矩阵m转换的,然后它们被转换成整数,并被剔除到图像大小。

    idx3 由源坐标的反向偏移分量 (x,y) 组装而成,用于索引原始图像

    为什么它们不是从 0,0 而不是 DIM//2 开始

    (0,0) 是图像的左上角数据数组。在考虑矩阵变换时,您通常认为 (0,0) 点位于图像的中心,因此是偏移量

    【讨论】:

    • 但是由于 0,0 是中心,为什么他以 x=112, y= -112 开头(假设 IMAGE_SIZE[0] 为 224)而不是 -112, 112,不应该第一个 x, y 基本上代表左上角的目标像素等等?感谢您的回复:)
    • 哦,没关系,还是一样的,只是切换反向偏移部分,谢谢
    猜你喜欢
    • 2017-01-17
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2018-07-17
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多