tensorflow: how to rotate an image for data augmentation?

后端 未结 7 2053
遇见更好的自我
遇见更好的自我 2020-12-09 05:27

In tensorflow, I would like to rotate an image from a random angle, for data augmentation. But I don\'t find this transformation in the tf.image module.

7条回答
  •  渐次进展
    2020-12-09 05:38

    Rotation and cropping in TensorFlow

    I personally needed image rotation and cropping out black borders functions in TensorFlow as below. And I could implement this function as below.

    def _rotate_and_crop(image, output_height, output_width, rotation_degree, do_crop):
        """Rotate the given image with the given rotation degree and crop for the black edges if necessary
        Args:
            image: A `Tensor` representing an image of arbitrary size.
            output_height: The height of the image after preprocessing.
            output_width: The width of the image after preprocessing.
            rotation_degree: The degree of rotation on the image.
            do_crop: Do cropping if it is True.
        Returns:
            A rotated image.
        """
    
        # Rotate the given image with the given rotation degree
        if rotation_degree != 0:
            image = tf.contrib.image.rotate(image, math.radians(rotation_degree), interpolation='BILINEAR')
    
            # Center crop to ommit black noise on the edges
            if do_crop == True:
                lrr_width, lrr_height = _largest_rotated_rect(output_height, output_width, math.radians(rotation_degree))
                resized_image = tf.image.central_crop(image, float(lrr_height)/output_height)    
                image = tf.image.resize_images(resized_image, [output_height, output_width], method=tf.image.ResizeMethod.BILINEAR, align_corners=False)
    
        return image
    
    def _largest_rotated_rect(w, h, angle):
        """
        Given a rectangle of size wxh that has been rotated by 'angle' (in
        radians), computes the width and height of the largest possible
        axis-aligned rectangle within the rotated rectangle.
        Original JS code by 'Andri' and Magnus Hoff from Stack Overflow
        Converted to Python by Aaron Snoswell
        Source: http://stackoverflow.com/questions/16702966/rotate-image-and-crop-out-black-borders
        """
    
        quadrant = int(math.floor(angle / (math.pi / 2))) & 3
        sign_alpha = angle if ((quadrant & 1) == 0) else math.pi - angle
        alpha = (sign_alpha % math.pi + math.pi) % math.pi
    
        bb_w = w * math.cos(alpha) + h * math.sin(alpha)
        bb_h = w * math.sin(alpha) + h * math.cos(alpha)
    
        gamma = math.atan2(bb_w, bb_w) if (w < h) else math.atan2(bb_w, bb_w)
    
        delta = math.pi - alpha - gamma
    
        length = h if (w < h) else w
    
        d = length * math.cos(alpha)
        a = d * math.sin(alpha) / math.sin(delta)
    
        y = a * math.cos(gamma)
        x = y * math.tan(gamma)
    
        return (
            bb_w - 2 * x,
            bb_h - 2 * y
        )
    

    If you need further implementation of example and visualization in TensorFlow, you can use this repository. I hope this could be helpful to other people.

提交回复
热议问题